我环顾四周并尽力而为,但我无法解决这个问题:
我正在编译一个应用程序,它将动态加载用户创建的共享对象,例如 libmergestream.so。
mergestream.cpp(libmergestream.so 从中派生)包含 CImg 库调用。-lpthread -lX11 -lXext -lXrandr
我用标志编译共享对象。
接下来,我将应用程序的第二部分构建为可执行文件,并提供相同的标志和库:-L/usr/lib/x86_64-linux-gnu
通过链接器标志。
当我运行应用程序时,共享对象的加载失败并显示以下消息:
Sun Jun 3 19:35:24 2012[1,6]<stdout>:0x7f46705e4180 ../DALProcesses/lib/libmergestream.so: undefined symbol: XUnlockDisplay
为了确保没有遗漏任何内容,我采用了一个小型 CImg 库示例,并将其构建为可执行文件(无共享对象)。它运行良好。作为参考,我将其称为 CImgExample 二进制文件。
我在 CImgExample 二进制文件中查找符号:
nm CImgExample | grep 'XUn'
U XUngrabKeyboard
U XUnlockDisplay
U XUnmapWindow
二进制文件本身有未定义的符号,我仍然可以让它执行。
对于 CImgExample 上的 ldd:
linux-vdso.so.1 => (0x00007fff988f5000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4f08e61000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f4f08b2d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f0882c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4f08532000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f0831c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4f07f5e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4f090ab000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f4f07d40000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4f07b3c000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f4f07938000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f4f07732000)
为了比较,这里是 libmergestream.so 的 nm 输出:
nm libmergestream.so | grep 'XUn'
U XUngrabKeyboard
U XUnlockDisplay
U XUnmapWindow
这是应用程序的 ldd(称为“main”),它将动态加载 libmergestream.so:
linux-vdso.so.1 => (0x00007fff8dfff000)
libmpi.so.1 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa79c69a000)
libmpi_cxx.so.1 => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa79c495000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa79c195000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa79bf7e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa79bbc1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa79c8e4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa79b8c7000)
我注意到“main”中缺少这两个库引用:
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f4f07938000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f4f07732000)
有趣的是,我在 Linux 服务器上为共享库和“主”运行相同的构建过程,一切顺利。是我的笔记本讨厌某些东西,我不知道是什么。