2

我正在尝试编译在 Red Hat Linux 上的 HP UX 服务器上运行的程序。

它使用 xerces-c 库来解析 xml 文件。编译没问题,但是当我尝试运行它时,我收到以下消息

./a.out:加载共享库时出错:libxerces-c.so.28:无法打开共享对象文件:没有这样的文件或目录

我写了一个非常简单的程序来尝试理解发生了什么:

#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>



int main(int argc, char* argv[])
{
        return 0;
}

并像这样编译它:

g++ test.cpp -L./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include

令人惊讶的是,该文件实际上存在:

lib]$ ls
libxerces-c.a   libxerces-c.so.28    libxerces-depdom.a   libxerces-depdom.so.28
libxerces-c.so  libxerces-c.so.28.0  libxerces-depdom.so  libxerces-depdom.so.28.0

有什么想法吗 ?我觉得我错过了一些东西,但不知道是什么。

提前致谢。

4

3 回答 3

6

运行ldd a.out并查看链接器是否可以解析正确的 .so 文件

导出LD_LIBRARY_PATH以包含当前文件夹(以与 PATH 变量相同的方式)并再次检查 ldd

于 2009-11-12T14:29:58.410 回答
0

做你想做的事的好方法是以下一种:

g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include

或者

g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include

Xlinker 或 Wl 选项允许您使用特定的链接选项,您无需修改​​ LD_LIBRARY_PATH

于 2009-11-12T15:39:51.003 回答
0

您需要告诉运行时 c 库在哪里可以找到在您的代码中没有静态编译并且在通常的 /lib 和 /usr/lib 位置中没有的各种符号。

为此,您可以将共享库的路径添加到 LD_LIBRARY_PATH。在这种情况下,这将是您为编译器的 -L 参数输入的内容。

于 2009-11-13T08:39:52.383 回答