2012-04-09 10 views
1

私はFFmpegのオブジェクトとDELAにC++クラスを使用している私のプログラムを構築しようとしている問題を抱えています:エラー建物アプリ

Undefined symbols for architecture armv7: 
    "__Z13avcodec_open2P14AVCodecContextP7AVCodecPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z21avcodec_decode_audio4P14AVCodecContextP7AVFramePiP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z20avformat_close_inputPP15AVFormatContext", referenced from: 
     __Z11closeStreamv in RTPReader.o 
    "__Z21avformat_network_initv", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z26avcodec_get_frame_defaultsP7AVFrame", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z15av_register_allv", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z19av_find_best_streamP15AVFormatContext11AVMediaTypeiiPP7AVCodeci", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z14av_free_packetP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
     __Z11closeStreamv in RTPReader.o 
    "__Z6av_logPviPKcz", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z19avformat_open_inputPP15AVFormatContextPKcP13AVInputFormatPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z26av_samples_get_buffer_sizePiii14AVSampleFormati", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z19avcodec_alloc_framev", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z25avformat_find_stream_infoP15AVFormatContextPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z13av_read_frameP15AVFormatContextP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

はどういうわけか、それはすべて私のC++メソッドに##接頭辞_Zをaddngされますなぜ、誰かが問題の可能性について指導してくれるのだろうか?分かりません。

+0

正しいライブラリとファイルにリンクしていますか?質問にアプリケーションを構築するために使用するコマンドライン(またはMakefileの関連部分)を追加できますか? –

答えて

2

アルご覧__Z ##のものは、正常です。 C++で '名前のマングリング'と呼ばれています。詳しくはhttp://en.wikipedia.org/wiki/Name_manglingを参照してください。

私はここでいくつかの推測をする必要があります。詳細情報が不足しています(申し訳ありませんが、私はまだコメントできません、答えのみ)。 ffmpeg api docsを見ると、FFmpegにはC++ではなくC APIがあるようです。それは確かにそうであるならば、あなたのソリューションは、(説明のためにhttp://developers.sun.com/solaris/articles/mixing.htmlを参照)例えば、にextern「C」でFFmpegのファイルのすべての#includeをラップすることがあります、リンクが失敗した理由については

extern "C" { 
    #include <someffmpegheader.h> 
} 

、されていますあらかじめ構築されたffmpegライブラリとリンクするか、プロジェクトにffmpegソースファイルを含めていますか?ライブラリにリンクしている場合、正しいアーキテクチャがない可能性があります。ターミナルウィンドウで次のコマンドを実行すると、ライブラリで使用できるアーキテクチャを教えてくれます。

file libffmpeg.a 
+0

解決済み!,ありがとうございました。 –

+0

私はこのコードをCからC++に変換するときに何度もこのミスを犯したと信じられません。 (グーグル・リバブの名前のmanglingとブームはここにあった) –

0

このライブラリはextern "C"とリンクしていたようですが、この句なしでリンクしようとしています。おそらく、あるバージョンの.Hファイルと.LIBファイルを完全に別のバージョンから取得します。

てみ使用インポート機能ではextern「C」句 - C++でのあなたは、C++コードからアクセスC関数をしようとすると、この句を使用する必要があります

+0

ありがとう、本質的に正しいです。 –