我在32位Fedora Core 9机器上静态构建了X11R5库。然后我构建了一个使用X11并静态链接的应用程序。到现在为止还挺好。 ldd报告它是一个静态链接的应用程序。我可以在本地运行它就好了。但是当我将它复制到64位FC9机器时,它失败如下:
assistant.static:xcb_io.c:228:_XSend:断言`!dpy-> xcb-> request_extra'失败。
中止
当我运行strace时,它似乎试图打开libXfixes.so:
...
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libXfixes.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes.so", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447) = 0
open("libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 8
fstat64(0x8, 0xff86a9e8) = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447) = 0
open("libXfixes.so.4", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 8
fstat64(0x8, 0xff86a9e8) = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libXfixes.so.4", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes.so.4", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447) = 0
open("libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 8
fstat64(0x8, 0xff86a9e8) = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447) = 0
write(2, "assistant.static: xcb_io.c:228: "..., 85assistant.static: xcb_io.c:228: _XSend: Assertion `!dpy->xcb->request_extra' failed.
我不明白为什么静态链接的应用程序会尝试打开共享的X库。不应该通过静态链接包含运行应用程序所需的所有内容(当然除了应用程序所做的任何Linux系统调用,需要在外部处理)。
感谢您的解释!
答案 0 :(得分:0)
X11动态加载库,它可能正在加载64位库而不是32位版本。
在运行时加载模块是正常的 - 比如加载插件或驱动程序时。而且由于这些模块与X11本身动态链接,你会发现自己陷入了混乱。
就个人而言,我从来没有幸运地将X11静态连接 - 真的需要你吗?
答案 1 :(得分:0)
我似乎遇到了同样的问题,发现了最酷的黑客!问题是它只是尝试加载libXcursor.so.1,最终拖动libX11&所有的朋友也都在。
我的解决方案:编辑EXE并将libXcursor.so.1或libXfixes.so重命名为libREMOVED.so或具有相同#字母的内容。然后它将跳过加载那些可选扩展。
答案 2 :(得分:0)
您使用的其中一个库是dlopen
libXfixes
。这些日子很受欢迎。你可以
dlopen
/ dlsym
,并链接到libXfixes
的静态版本。/opt/yourappname/lib
,并将所有.so
放在该目录中。或者,如果您希望用户能够在任何地方安装,请使用设置LD_LIBRARY_PATH
的启动shell脚本。断言失败可能与libXfixes
有关,也可能与libXfixes.so
无关,您可以通过将{{1}}复制到目标计算机来快速检查。