Ubuntu系统下Eclipse IDE 4.8.0M4中FFmpeg开发链接器配置求助
嘿,我一眼就看出你遇到的是FFmpeg库链接顺序的问题——GCC的链接器是按从左到右的顺序处理库的,依赖其他库的库必须放在被依赖库的后面,不然就会出现这类undefined reference的报错。
核心问题:库链接顺序颠倒
你当前的链接参数把-lavcodec放在了最前面,但libavcodec其实依赖libavutil等底层库,链接器先处理lavcodec时,找不到后续库提供的符号,自然就报错了。正确的FFmpeg库链接顺序得遵循依赖链从高到低的原则,也就是让依赖其他库的库先出现,被依赖的库后出现:
-lavformat -lavcodec -lavfilter -lavdevice -lavutil -lswscale -lswresample -lpostproc -lz -llzma -lrt
举个例子:lavformat(格式处理)依赖lavcodec(编解码),lavcodec又依赖lavutil(工具函数),所以顺序必须是lavformat在前,lavcodec中间,lavutil最后。
额外检查:库路径是否完整
你现在只添加了/home/git/ffmpeg/libavcodec和/home/git/ffmpeg/libavformat的路径,但FFmpeg的其他库(比如libavutil、libswscale这些)都在各自的目录里,得把这些目录都加到链接路径里:
-L/home/git/ffmpeg/libavcodec -L/home/git/ffmpeg/libavformat -L/home/git/ffmpeg/libavutil -L/home/git/ffmpeg/libswscale -L/home/git/ffmpeg/libswresample -L/home/git/ffmpeg/libavfilter -L/home/git/ffmpeg/libavdevice -L/home/git/ffmpeg/libpostproc
如果当初编译FFmpeg时,把所有库都统一放到了/home/git/ffmpeg/lib目录下(很多默认编译会这么做),那直接加-L/home/git/ffmpeg/lib就省事多了。
确认静态库编译状态
你用的是静态库(libavcodec.a),得确保编译FFmpeg时开启了静态库支持。如果/home/git/ffmpeg/libavcodec下只有.so动态库文件,那得重新编译FFmpeg:
cd /home/git/ffmpeg ./configure --enable-static --disable-shared # 加上你需要的其他配置参数 make -j$(nproc) # 用多线程加速编译
Eclipse里的配置调整步骤
打开项目属性→C/C++ Build→Settings→GCC C Linker:
- Library search path (-L):把所有FFmpeg库所在的目录都加进去,或者直接加统一的
/home/git/ffmpeg/lib - Libraries (-l):按我给的顺序添加库:
avformat、avcodec、avfilter、avdevice、avutil、swscale、swresample、postproc、z、lzma、rt
调整完这些,重新编译项目,那些未定义引用的报错应该就消失啦!
内容的提问来源于stack exchange,提问作者boergi

