libavdevice 和 x11 的静态链接库应该以什么顺序链接?

In what order should statically linked libraries for libavdevice and x11 be linked?

本文关键字:链接 以什么 顺序 x11 静态 libavdevice      更新时间:2023-10-16

当前静态链接我的项目时遇到问题。将avdevice添加为静态链接后,我收到以下错误。

:-1: 错误:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libXext.a(XShm.o(: 对符号"_XGetBitsPerPixel"的未定义引用

以下是我静态添加的库的片段。

LIBS += -L"/usr/local/lib" 
-L"/usr/local/lib64" 
-lm -lz -llzma -lass -lfreetype -lmp3lame -ltheora -lvorbis -lvorbisenc -lva -lva-drm -lva-x11 -ldrm -logg -lvpx -lopenh264 -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice -lX11 -lXfixes -lXext -lxcb -lXdmcp -lXau 

我尝试在 -lX11 前面移动 -lXext,但得到了一大堆未定义的引用,例如

error: undefined reference to `uncompress'

这些静态链接的库需要按什么顺序进行编译?

用于解析外部引用的链接器算法的工作方式如下:

  1. 按命令行顺序扫描 .o 文件和 .a 文件
  2. 在扫描期间,保留当前未解析的引用的列表
  3. 当遇到每个新的 .o 或 .a 文件 obj 时,请尝试根据 obj 中定义的符号解析列表中每个未解析的引用
  4. 如果在扫描结束时未解析列表中有任何条目,则抛出错误

在您的情况下,这意味着当将-lXext移动到-lX11前面时,uncompressed将保持未解析状态,因为在扫描-lXextuncompressed不在未解析的引用列表中。正如@jww注释中指出的那样,您可以创建一个组来解决问题,因为您反复尝试使用每个新添加的库来解决每个未解决的引用,这意味着顺序无关紧要。 这可以通过以下方式完成:-Wl,--start-group lib.o ... list.o -Wl,--end-group,您将lib.o ... list.o替换为上面的库。