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

问题描述 投票:0回答:2

当前在静态链接我的项目时遇到问题。将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 \

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

error: undefined reference to `uncompress'

这些静态链接的库需要按什么顺序才能编译项目?

c++ linux ffmpeg static-libraries x11
2个回答
0
投票

需要需要符号的库/目标文件通常应该在任何提供符号之前列出。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.