使用以下命令将二进制文件与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)
报告答案 0 :(得分:2)
您的链接器(或gcc)可能会在幕后自动添加--as-needed
,而系统XShapeCombineRectangles
上的链接可能来自某些库其他而不是libXext。
您可以在链接中找到定义XShapeCombineRectangles
符号的库:只需将-Wl,-y,XShapeCombineRectangles
添加到您的链接行。
添加-v
将显示是否有任何--as-needed
参数在起作用。
您可以通过将libXext
附加到链接行来强制最终的可执行文件引用-Wl,--no-as-needed,-lXext
。
更新:我误解了这个问题(你的表述非常糟糕)。
重申:
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
“书架”中提取,因此,尽管--export-dynamic
,仍未从主可执行文件中导出。