首页 文章

'gcc -lXext'成功但libXext似乎没有链接

提问于
浏览
0

使用以下命令将二进制文件与gcc链接:

gcc notion.o -Wl,-whole-archive ../ioncore/ioncore.a -Wl,-no-whole-archive -L/usr/X11R6/lib -lX11 -lXext -lSM -lICE -Wl,-whole-archive -L../libmainloop -lmainloop -lextl -ltu -Wl,-no-whole-archive pkg-config --libs lua5.1 -ldl -lm -lrt -Xlinker --export-dynamic -o notion

链接成功 - 但是,在启动应用程序时,用户会因未定义的符号( XShapeCombineRectangles )而报告崩溃 . XShapeCombineRectangles 应该在libXext中可用 .

实际上,使用'ldd'检查时,Xext未被列为此用户的共享库依赖项:

linux-gate.so.1 => (0x0068f000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0x00ec7000)
liblua5.1.so.0 => /usr/lib/i386-linux-gnu/liblua5.1.so.0
(0x00226000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x005da000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x005e1000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x0032c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00335000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0x007d6000)
/lib/ld-linux.so.2 (0x00882000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0
(0x006dc000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x00110000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6
(0x00dd8000)

当我自己编译应用程序时,ldd确实显示了libXext,并且确实没有崩溃 .

这可能会发生什么?

(更多背景信息:此错误报告于http://sourceforge.net/tracker/?func=detail&aid=3427206&group_id=314802&atid=1324528

1 回答

  • 2

    您的链接器(或gcc)可能会在后台自动添加 --as-needed ,而您系统上的那些 XShapeCombineRectangles 来自libXext以外的某些库 .

    您可以在链接中找到哪个库定义了 XShapeCombineRectangles 符号:只需将 -Wl,-y,XShapeCombineRectangles 添加到您的链接行即可 .

    添加 -v 将显示是否有任何 --as-needed 参数在起作用 .

    您可以通过将 -Wl,--no-as-needed,-lXext 附加到链接行来强制最终可执行文件引用 libXext .

    Update :我误解了这个问题(你的表述非常糟糕) .

    重述:

    • 应用程序链接并在OPs系统上正常工作, ldd app 显示对libXext的依赖

    • 应用程序还在最终用户系统上正确链接和启动,但 ldd app 未显示libXext

    • 当应用程序在最终用户系统上尝试 dlopen("de.so", ...) 时,此操作因 de.so: undefined symbol XShapeCombineRectangles 而失败

    如果以上几点是正确的,那很可能就是这样

    • 最终用户系统有 libXext.a ,但不是 libXext.so

    • 主应用程序不调用 XShapeCombineRectangles ,只有 de.so 中的代码

    • 链接 de.so 时,其链接行上没有 -lXext .

    安装 libXext.so 或将主应用程序与 -u XShapeCombineRectangles 链接可能会解决问题 .

    要了解此问题,您可能需要阅读this .

    我的猜测是 XShapeCombineRectangles 没有从主可执行文件引用,因此没有从 libXext.a "bookshelf"中提取,因此尽管 --export-dynamic 没有从主可执行文件中导出 .

相关问题