如何链接SYSV与GNU/Linux格式的共享库?
库链接问题与解决方法
库文件信息
执行file命令得到两个库的详细信息:
file /usr/lib/aarch64-linux-gnu/libavcodec-ffmpeg.so.56.60.100 /usr/lib/aarch64-linux-gnu/libavcodec-ffmpeg.so.56.60.100: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=e534adc24d3ba924851e5a11dc9eee87d5008d36, stripped file /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.2.4.9 /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.2.4.9: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=2a6d6bf1318da7a8593b96359b3c8a66008744ee, stripped
注意这两个库的ELF格式分别为(SYSV)与(GNU/Linux)。
链接错误现象
使用gcc/c++链接器链接这两个库时,出现以下错误:
libopencv_highgui.so.2.4.9: undefined reference to `avio_close@LIBAVFORMAT_FFMPEG_56'
经确认,该符号实际存在于对应库中,且已保证-l参数顺序正确(libavcodec-ffmpeg.so在libopencv_highgui.so之后),但链接仍失败。
可行解决方法
- 检查并补充依赖库:
avio_close@LIBAVFORMAT_FFMPEG_56属于libavformat库而非libavcodec,先执行命令验证符号位置:
若符号存在,链接时添加nm -D /usr/lib/aarch64-linux-gnu/libavformat-ffmpeg.so.56 | grep avio_close-lavformat-ffmpeg参数。 - 临时忽略未解析符号:使用链接器选项
-Wl,--unresolved-symbols=ignore-in-shared-libs强制完成链接,但此方法可能导致运行时错误,仅在确认符号可正常调用时使用。 - 重新编译匹配版本的库:若系统库版本不兼容,从源码编译OpenCV,指定链接当前系统中的ffmpeg库,确保两者使用相同的ELF格式和符号规则。
- 验证库依赖版本:执行
ldd /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.2.4.9查看其依赖的ffmpeg相关库版本,确认与当前链接的libavcodec-ffmpeg.so版本一致,避免版本不匹配导致符号查找失败。
内容的提问来源于stack exchange,提问作者Michaelzh
相关产品推荐
相关产品推荐

