使用以下命令将二进制文件与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 回答
您的链接器(或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
没有从主可执行文件中导出 .