C++ Ubuntu。使用 FFMPEG 库编译的多个未定义引用 [关闭]

Posted

技术标签:

【中文标题】C++ Ubuntu。使用 FFMPEG 库编译的多个未定义引用 [关闭]【英文标题】:C++ Ubuntu. Multiple undefined references compiling with FFMPEG libs [closed] 【发布时间】:2013-05-19 11:18:04 【问题描述】:

我在 Ubuntu 12.10 和标头上安装了 FFMPEG 库,正如 here 所描述的那样。

在我编译 (gcc) 时使用 FFMPEG 的 C++ 应用程序中,我得到了这个:

/usr/local/lib/libavcodec.a(libfaac.o):在函数中 Faac_encode_frame': /root/ffmpeg/libavcodec/libfaac.c:179: undefined reference tofaacEncEncode' /usr/local/lib/libavcodec.a(libfaac.o): 在函数Faac_encode_close': /root/ffmpeg/libavcodec/libfaac.c:52: undefined reference tofaacEncClose' /usr/local/lib/libavcodec.a(libfaac.o):在函数中 Faac_encode_init': /root/ffmpeg/libavcodec/libfaac.c:78: undefined reference tofaacEncOpen' /root/ffmpeg/libavcodec/libfaac.c:88: 未定义对faacEncGetCurrentConfiguration' /root/ffmpeg/libavcodec/libfaac.c:139: undefined reference to faacEncGetDecoderSpecificInfo' /root/ffmpeg/libavcodec/libfaac.c:153 的引用: 对faacEncSetConfiguration' /usr/local/lib/libavcodec.a(libfdk-aacenc.o): In function aac_encode_close'的未定义引用:/root/ffmpeg/libavcodec/libfdk-aacenc.c:99: 对aacEncClose' /usr/local/lib/libavcodec.a(libfdk-aacenc.o): In function aac_encode_frame'的未定义引用:/root/ffmpeg/libavcodec/libfdk-aacenc.c:344: 对aacEncEncode' /usr/local/lib/libavcodec.a(libfdk-aacenc.o): In function aac_encode_init'的未定义引用:/root/ffmpeg/libavcodec/libfdk-aacenc.c:116: 对aacEncOpen' /root/ffmpeg/libavcodec/libfdk-aacenc.c:125: undefined reference to aacEncoder_SetParam'/root/ffmpeg/libavcodec/libfdk-aacenc.c:132 的未定义引用: 对aacEncoder_SetParam' /root/ffmpeg/libavcodec/libfdk-aacenc.c:140: undefined reference to aacEncoder_SetParam'/root/ffmpeg/libavcodec/libfdk-aacenc.c:160 的未定义引用: 对aacEncoder_SetParam' /root/ffmpeg/libavcodec/libfdk-aacenc.c:167: undefined reference to aacEncoder_SetParam' 的未定义引用 /usr/local/lib/libavcodec.a(libfdk-aacenc.o):/root/ffmpeg/libavcodec/libfdk-aacenc.c:185: 对aacEncoder_SetParam' follow /usr/local/lib/libavcodec.a(libfdk-aacenc.o): In function aac_encode_init'的更多未定义引用:/root/ffmpeg/libavcodec/libfdk-aacenc.c:263: 未定义对aacEncEncode' /root/ffmpeg/libavcodec/libfdk-aacenc.c:269: undefined reference to aacEncInfo' /usr/local/lib/libavcodec.a(libmp3lame.o) 的引用:在函数中 mp3lame_encode_frame': /root/ffmpeg/libavcodec/libmp3lame.c:204: undefined reference tolame_encode_buffer_float' /root/ffmpeg/libavcodec/libmp3lame.c:188:未定义的引用 lame_encode_buffer' /root/ffmpeg/libavcodec/libmp3lame.c:191: undefined reference tolame_encode_buffer_int' /root/ffmpeg/libavcodec/libmp3lame.c:210:未定义的引用 lame_encode_flush' /usr/local/lib/libavcodec.a(libmp3lame.o): In functionmp3lame_encode_close': /root/ffmpeg/libavcodec/libmp3lame.c:88:未定义的引用 lame_close' /usr/local/lib/libavcodec.a(libmp3lame.o): In function mp3lame_encode_init':/root/ffmpeg/libavcodec/libmp3lame.c:100: 对lame_init' /root/ffmpeg/libavcodec/libmp3lame.c:104: undefined reference to lame_set_num_channels'/root/ffmpeg/libavcodec/libmp3lame.c:105 的未定义引用: 对lame_set_mode' /root/ffmpeg/libavcodec/libmp3lame.c:108: undefined reference to lame_set_in_samplerate'/root/ffmpeg/libavcodec/libmp3lame.c:109 的未定义引用: 未定义对lame_set_out_samplerate' /root/ffmpeg/libavcodec/libmp3lame.c:113: undefined reference to lame_set_quality' /root/ffmpeg/libavcodec/libmp3lame.c:115 的引用:未定义 参考lame_set_quality' /root/ffmpeg/libavcodec/libmp3lame.c:119: undefined reference to lame_set_VBR' /root/ffmpeg/libavcodec/libmp3lame.c:120: 未定义 参考lame_set_VBR_quality' /root/ffmpeg/libavcodec/libmp3lame.c:123: undefined reference to lame_set_brate' /root/ffmpeg/libavcodec/libmp3lame.c:127:未定义 参考lame_set_bWriteVbrTag' /root/ffmpeg/libavcodec/libmp3lame.c:130: undefined reference to lame_set_disable_reservoir' /root/ffmpeg/libavcodec/libmp3lame.c:133: 对lame_init_params' /root/ffmpeg/libavcodec/libmp3lame.c:139: undefined reference to lame_get_encoder_delay'/root/ffmpeg/libavcodec/libmp3lame.c:142 的未定义引用: 对lame_get_framesize' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_wb_decode_close' 的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:363: 对D_IF_exit' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_decode_frame'的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:122: 对Decoder_Interface_Decode' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_wb_decode_frame'的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:352: 对D_IF_decode' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_encode_frame'的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:267: 未定义对Encoder_Interface_Encode' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_wb_decode_init' 的引用:/root/ffmpeg/libavcodec/libopencore-amr.c:318: 对D_IF_init' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_encode_close'的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:222: 对Encoder_Interface_exit' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_decode_close' 的未定义引用:/root/ffmpeg/libavcodec/libopencore-amr.c:86: 未定义对Decoder_Interface_exit' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_encode_init' 的引用:/root/ffmpeg/libavcodec/libopencore-amr.c:205: 未定义对Encoder_Interface_init' /usr/local/lib/libavcodec.a(libopencore-amr.o): In function amr_nb_decode_init' 的引用:/root/ffmpeg/libavcodec/libopencore-amr.c:73: 对Decoder_Interface_init' /usr/local/lib/libavcodec.a(libspeexdec.o): In function libspeex_decode_frame'的未定义引用:/root/ffmpeg/libavcodec/libspeexdec.c:139: 对speex_bits_remaining' /root/ffmpeg/libavcodec/libspeexdec.c:147: undefined reference to speex_bits_read_from' /root/ffmpeg/libavcodec/libspeexdec.c:152 的未定义引用: 对speex_decode_int' /root/ffmpeg/libavcodec/libspeexdec.c:140: undefined reference to speex_bits_peek_unsigned' /root/ffmpeg/libavcodec/libspeexdec.c:158 的未定义引用: 对speex_decode_stereo_int' /usr/local/lib/libavcodec.a(libspeexdec.o): In function libspeex_decode_close'的未定义引用:/root/ffmpeg/libavcodec/libspeexdec.c:169: 对speex_bits_destroy' /root/ffmpeg/libavcodec/libspeexdec.c:170: undefined reference to speex_decoder_destroy'/usr/local/lib/libavcodec.a(libspeexdec.o) 的未定义引用:在 函数libspeex_decode_init': /root/ffmpeg/libavcodec/libspeexdec.c:48: undefined reference to speex_packet_to_header'/root/ffmpeg/libavcodec/libspeexdec.c:67: 对speex_header_free' /root/ffmpeg/libavcodec/libspeexdec.c:82: undefined reference to speex_lib_get_mode' /root/ffmpeg/libavcodec/libspeexdec.c:100 的未定义引用: 对speex_bits_init' /root/ffmpeg/libavcodec/libspeexdec.c:101: undefined reference to speex_decoder_init'/root/ffmpeg/libavcodec/libspeexdec.c:110 的未定义引用: 对speex_std_stereo_request_handler' /root/ffmpeg/libavcodec/libspeexdec.c:113: undefined reference to speex_decoder_ctl'/root/ffmpeg/libavcodec/libspeexdec.c:43 的未定义引用: 对 `speex_nb_mode' 的未定义引用

还有更多......

当我编译时,我链接到这些库:

-lfaac -lavformat -lavcodec -lavutil -lavfilter -lswscale

有什么问题?

【问题讨论】:

尝试重新排序库。首先将-lavcodec 放在后面。 您知道正确的顺序吗?将 lavcodec 放在最后没有帮助。 我建议看一下 Ubuntu 附带的 ffmpeg 库,看看它是如何编译的:apt-get source ffmpeg 不知道。从左到右按顺序只扫描一次依赖项。您可以尝试将整个库集重复两次,例如 -lfaac -lavformat -lavcodec -lavutil -lavfilter -lswscale -lfaac -lavformat -lavcodec -lavutil -lavfilter -lswscale 【参考方案1】:

我设法编译了。对于那些感兴趣的人:

首先我禁用了一些模块(我并没有真正使用):

./configure --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame \ --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libspeex --enable-librtmp --disable-libtheora \ --enable-libvorbis --enable-libvpx --enable-x11grab --enable-libx264 --enable-nonfree --enable-version3

然后我按此顺序链接其余依赖项:

-lavformat -lavcodec -lfaac -lmp3lame -lfdk-aac -lvpx -lx264 -lavdevice -lyasm -lavutil -lswscale -lrtmp -lvorbisenc -lva

【讨论】:

以上是关于C++ Ubuntu。使用 FFMPEG 库编译的多个未定义引用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Linux Ubuntu 编译FFMPEG音视频库,并实现例程

FFmpeg移植Android编译生成多库

FFmpeg移植Android编译生成单个库

使用 g++ 编译器 (Ubuntu) 将 Allegro 库链接到 C++ 应用程序

ubuntu11.04 编译ffmpeg2.7 并生成 ffplay进行流媒体測试

FFmpeg之Linux下编译与调试