2012-04-09 72 views
1

我有試圖建立我的程序,它使用C++類德拉與FFmpeg的對象問題:錯誤建築應用

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) 

不知怎的,它是addng前綴_Z ##我所有的C++方法,我不知道爲什麼,有人可以指導這個問題是什麼?

+0

您是否正在鏈接正確的庫和文件?你可以添加你用來構建應用程序到你的問題的命令行(或你的Makefile的相關部分)嗎? – 2012-04-09 21:45:26

回答

2

看到A1中的__Z ##的東西,是正常的。它在C++中被稱爲'name mangling',請參閱http://en.wikipedia.org/wiki/Name_mangling以獲得很好的解釋。

我必須在這裏做幾個猜測,缺少更詳細的信息(對不起,我還不能評論,只有答案)。看看ffmpeg api文檔,似乎FFmpeg有一個C API,而不是C++。如果情況確實如此,你的解決方案可能是包裹的FFmpeg的文件的所有#包括與外部的「C」,例如(見http://developers.sun.com/solaris/articles/mixing.html進行說明):

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

至於鏈路故障的原因,是你鏈接到一個預先構建的ffmpeg庫,還是你在項目中包含ffmpeg源文件?如果你鏈接到一個庫,它可能沒有正確的體系結構。如果您在終端窗口中運行以下命令,它會告訴您該庫中有哪些體系結構可用:

file libffmpeg.a 
+0

解決!,非常感謝詳細的解釋。 – 2012-04-10 13:00:07

+0

不能相信我從c轉換到C++調用代碼時犯了多少次這個錯誤,謝謝Stefan提醒! (搜索到的libav名稱被破壞並繁榮在這裏) – 2012-09-22 21:55:33

0

在我看來,這個庫與extern「C」鏈接,但你嘗試鏈接沒有這個條款。也許你從一個版本取得.H文件,而從另一個版本取得.LIB文件。進口功能

嘗試使用的extern「C」的條款 - 在C++中,當你從C++代碼試圖訪問C函數,應使用此條款

+0

謝謝,你基本上是正確的。 – 2012-04-10 12:59:52