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

标签 c++ linux ffmpeg static-libraries x11

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

:-1: error: /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libXext.a(XShm.o): undefined reference to symbol '_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 前面,但得到一大堆 undefined reference ,例如
error: undefined reference to `uncompress'

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

最佳答案

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

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

  • 在您的情况下,这意味着在移动 -lXext 时在 -lX11 前面, uncompressed将保持未解决为 uncompressed -lXext 时不属于 Unresolved 引用列表的一部分正在被扫描。正如@jww 在评论中指出的那样,您可以 创建群摆脱问题,因为您反复尝试使用每个新添加的库解决每个 Unresolved 引用,这意味着顺序无关紧要。
    这可以通过以下方式完成:-Wl,--start-group lib.o ... list.o -Wl,--end-group , 在哪里替换 lib.o ... list.o与您上面的库。

    关于c++ - libavdevice 和 x11 的静态链接库应该以什么顺序链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427968/

    相关文章:

    c++ - fstream 和 ofstream

    linux - 如何替换目录中所有文件名中的字符串? (具体来说,我需要从目录中的所有文件名中删除 "\#015"

    linux - 在配置脚本中硬编码的 automake 版本 (am__api_version)

    ffmpeg:每帧请求的位太多

    c++ - C++ DLL 中全局变量的范围是什么

    c++ - 在 lambda 中使用模板参数

    c++ - 通过 SYSTEMTIME 检查文件的 LastWriteTime 是昨天

    linux - 将文件内容传递给 docker exec

    c++ - 如何在 C++ 中使用 ffmpeg 从视频中提取音频?

    php - Windows 上的 FFmpeg - 后台转换