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

时间:2011-10-22 21:55:21

标签: linux gcc linker crash dynamic-linking

使用以下命令将二进制文件与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

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

确实,使用'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 个答案:

答案 0 :(得分:2)

您的链接器(或gcc)可能会在幕后自动添加--as-needed,而系统XShapeCombineRectangles上的链接可能来自某些库其他而不是libXext。

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

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

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

更新:我误解了这个问题(你的表述非常糟糕)。

重申:

  1. 应用程序链接并在OPs系统上正常工作,ldd
    app
    显示对libXext的依赖
  2. 应用程序还会在最终用户系统上正确链接和启动,但ldd app 显示libXext
  3. 当应用程序在最终用户系统上尝试dlopen("de.so", ...)时,此操作因de.so: undefined symbol XShapeCombineRectangles
  4. 而失败

    如果以上几点是正确的,则可能是

    1. 最终用户系统有libXext.a,但不是libXext.so
    2. 主应用程序不会调用XShapeCombineRectangles,只会调用de.so中的代码
    3. 关联de.so时, 链接行上没有-lXext
    4. 安装libXext.so或将主应用程序与-u XShapeCombineRectangles相关联可能会解决问题。

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

      我的猜测是XShapeCombineRectangles未从主可执行文件中引用,因此未从libXext.a“书架”中提取,因此,尽管--export-dynamic,仍未从主可执行文件中导出。