DM365交叉编译问题总结

本文记录了在Ubuntu 12.04 LTS环境下,使用CMake编译crtmpserver过程中遇到的FFmpeg与Zlib库依赖问题及解决过程。通过调整库链接顺序,最终成功解决了未定义符号引用的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        PC系统用的是:Ubuntu 12.04.4 LTS

        交叉工具安装包:mvl_5_0_0801921_demo_sys_setuplinux.bin

        编译开源流媒体服务工程:crtmpserver,其中用到ffmpeg,zlib等开源库。采用静态编译方式,将ffmpeg编译成libavformat.a,libavcodec.a,libavutil.a等静态库,将zlib编译成libz.a,然后再crtmpserver中引用。编译采用cmake的方式,crtmpserver的工程文件CMakeLists.txt中的库依赖关系如下:

TARGET_LINK_LIBRARIES(${PROJECT_NAME}
	${APPS_LIBS}
	thelib
	common
	pthread
	${TINYXML_LIBRARY_PATH}
	${LUA_LIBRARY_PATH}
	${OPENSSL_LIBRARY_PATH}
	${CRYPTO_LIBRARY_PATH}
	${Z_LIBRARY_PATH}
	${DL_LIBRARY_PATH}
	${AVCODEC_LIBRARY_PATH}
	${AVFORMAT_LIBRARY_PATH}
	${SWSCALE_LIBRARY_PATH}
	${AVUTIL_LIBRARY_PATH}
)
编译出现错误1如下:

/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(allformats.o): In function `av_register_all':
allformats.c:(.text+0x28): undefined reference to `avcodec_register_all'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(dv.o): In function `avpriv_dv_produce_packet':
dv.c:(.text+0x3ac): undefined reference to `avpriv_dv_frame_profile'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(dv.o): In function `dv_read_seek':
dv.c:(.text+0xef8): undefined reference to `avpriv_dv_codec_profile'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(dv.o): In function `dv_read_header':
dv.c:(.text+0x1314): undefined reference to `avpriv_dv_frame_profile'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(latmenc.o): In function `latm_write_header':
latmenc.c:(.text+0x4c): undefined reference to `avpriv_mpeg4audio_get_config'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(latmenc.o): In function `latm_write_packet':
latmenc.c:(.text+0x2c0): undefined reference to `avpriv_copy_bits'
latmenc.c:(.text+0x2c8): undefined reference to `avpriv_align_put_bits'
latmenc.c:(.text+0x490): undefined reference to `avpriv_copy_bits'
latmenc.c:(.text+0x670): undefined reference to `avpriv_copy_bits'
latmenc.c:(.text+0x6f0): undefined reference to `avpriv_copy_pce_data'
latmenc.c:(.text+0x78c): undefined reference to `avpriv_copy_bits'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mov.o): In function `mov_read_dac3':
mov.c:(.text+0x2858): undefined reference to `avpriv_ac3_channel_layout_tab'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mov.o): In function `mov_read_dec3':
mov.c:(.text+0x33bc): undefined reference to `avpriv_ac3_channel_layout_tab'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mov.o): In function `ff_mov_read_stsd_entries':
mov.c:(.text+0x83b4): undefined reference to `av_get_bits_per_sample'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mpegts.o): In function `mpegts_set_stream_info':
mpegts.c:(.text+0x26e0): undefined reference to `avcodec_is_open'
mpegts.c:(.text+0x2778): undefined reference to `avcodec_is_open'
mpegts.c:(.text+0x2854): undefined reference to `avcodec_is_open'
mpegts.c:(.text+0x28cc): undefined reference to `avcodec_is_open'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mpegts.o): In function `ff_parse_mpeg2_descriptor':
mpegts.c:(.text+0x43d0): undefined reference to `avcodec_is_open'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mpegts.o):mpegts.c:(.text+0x4434): more undefined references to `avcodec_is_open' follow
......
解决办法

修改库依赖关系如下:

TARGET_LINK_LIBRARIES(${PROJECT_NAME}
	${APPS_LIBS}
	thelib
	common
	pthread
	${TINYXML_LIBRARY_PATH}
	${LUA_LIBRARY_PATH}
	${OPENSSL_LIBRARY_PATH}
	${CRYPTO_LIBRARY_PATH}
	${Z_LIBRARY_PATH}
	${DL_LIBRARY_PATH}
	${AVFORMAT_LIBRARY_PATH}
	${AVCODEC_LIBRARY_PATH}
	${SWSCALE_LIBRARY_PATH}
	${AVUTIL_LIBRARY_PATH}
)
重新编译,出现错误2如下:

/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(http.o): In function `http_read_header':
http.c:(.text+0xb68): undefined reference to `inflateEnd'
http.c:(.text+0xb7c): undefined reference to `inflateInit2_'
http.c:(.text+0xb88): undefined reference to `zlibCompileFlags'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(http.o): In function `http_close':
http.c:(.text+0xfcc): undefined reference to `inflateEnd'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(http.o): In function `http_read_stream':
http.c:(.text+0x12c8): undefined reference to `inflate'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(id3v2.o): In function `id3v2_read_internal':
id3v2.c:(.text+0x19bc): undefined reference to `uncompress'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(mov.o): In function `mov_read_cmov':
mov.c:(.text+0x2f90): undefined reference to `uncompress'
/home/helei/project/video/source/videoclient0.0/3rdparty/ffmpeg/install/lib/libavformat.a(rtmpproto.o): In function `rtmp_calc_swfhash':
rtmpproto.c:(.text+0x2bd8): undefined reference to `inflateInit_'
rtmpproto.c:(.text+0x2c10): undefined reference to `inflate'
rtmpproto.c:(.text+0x2c80): undefined reference to `inflateEnd'
rtmpproto.c:(.text+0x2ca4): undefined reference to `inflateEnd'
collect2: ld returned 1 exit status
make[2]: *** [crtmpserver/crtmpserver] Error 1
make[1]: *** [crtmpserver/CMakeFiles/crtmpserver.dir/all] Error 2
make: *** [all] Error 2
build failed
解决方法

重新调整库的依赖关系如下:

TARGET_LINK_LIBRARIES(${PROJECT_NAME}
	${APPS_LIBS}
	thelib
	common
	pthread
	${TINYXML_LIBRARY_PATH}
	${LUA_LIBRARY_PATH}
	${OPENSSL_LIBRARY_PATH}
	${CRYPTO_LIBRARY_PATH}
	${DL_LIBRARY_PATH}
	${AVFORMAT_LIBRARY_PATH}
	${AVCODEC_LIBRARY_PATH}
	${SWSCALE_LIBRARY_PATH}
	${AVUTIL_LIBRARY_PATH}
	${Z_LIBRARY_PATH}
)
编译OK。不过没想明白,ffmpeg对zlib库有依赖,为啥要放在ffmpeg库的后面!!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何雷 — 智能网联汽车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值