现象:
在进行跨平台移植时,编译工程遇到如下提示:
/usr/bin/ld: tmp/obj/mywindow.o: undefined reference to symbol 'XShapeCombineRectangles'
/usr/bin/ld: //lib/x86_64-linux-gnu/libXext.so.6: error adding symbols: DSO missing from command line
分析:
首先查看源码mywindow.cpp ,代码中使用了 X11 库完成鼠标穿透,对比报错中的符号 “XShapeCombineRectangles” ,可以确定确实和 X11 库有关联。
由于是进行移植工作的,而 Windows 下一般不会使用 X11 作为窗口管理器,所以需要关注工程文件中是否链接了 X11 及其扩展库,排查 pro 文件后发现确实没有链接。
因此添加如下命令:
LIBS += -lX11
添加后发现问题还在,再观察一遍报错提示发现是在 链接 libXext.so.6 时报错 DSO missing from command line,因此再添加 x11 扩展库:
LIBS += -lX11 -lXext
问题解决。
小结:
- 找不到符号问题一定是缺库,具体缺什么库可以根据报错找不到的符号名来确定,比如当前问题中缺少的符号 “XShapeCombineRectangles” 就是 X11 库中的。
- 可以使用 dpkg -L libx11-dev 来确定库的安装位置,因为有时候自行编译库时会单独指定非系统链接路径,这个时候如果只是 -l库名 则也可能报错,此时就需要使用 -L库路径 单独指定链接路径。
- 可以使用 pkg-config --print-requires --print-requires-private x11 定位某个库的依赖库,因为缺少依赖库也会引发 DSO 问题,参考:linux - Linking error: DSO missing from command line - Stack Overflowhttps://stackoverflow.com/questions/24989432/linking-error-dso-missing-from-command-line