DM365交叉编译问题总结

来源:互联网 发布:daas实时的数据共享 编辑:程序博客网 时间:2024/06/05 20:11

        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}thelibcommonpthread${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}thelibcommonpthread${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 statusmake[2]: *** [crtmpserver/crtmpserver] Error 1make[1]: *** [crtmpserver/CMakeFiles/crtmpserver.dir/all] Error 2make: *** [all] Error 2build failed
解决方法

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

TARGET_LINK_LIBRARIES(${PROJECT_NAME}${APPS_LIBS}thelibcommonpthread${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库的后面!!

0 0