2012-04-09 70 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