xerces-c 2.8:加载共享库时出错

发布于 2024-08-10 19:38:56 字数 933 浏览 7 评论 0原文

我正在尝试编译在 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++测试.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

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

提前致谢。

I'm trying to compile a program running on an HP UX server on a Red Hat Linux.

It uses xerces-c library to parse xml files. Compilation is ok, but when i try to run it, I get the following message

./a.out: error while loading shared
libraries: libxerces-c.so.28: cannot
open shared object file: No such file
or directory

I wrote a very simple program to try and understand whats going on:

#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;
}

And compiled it like this:

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

Surprisingly the file is actually there:

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

Any thoughts ? I feel i'm missing something, but don't know what.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

绝對不後悔。 2024-08-17 19:38:56

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

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

run ldd a.out and see if the linker can resolve the right .so file

export LD_LIBRARY_PATH to include the current folder (in the same manner as the PATH variable) and check ldd again

相权↑美人 2024-08-17 19:38:56

执行您想要的操作的好方法是以下一种:

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

the good way to do what you want is the following one:

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

or

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

Xlinker or Wl options allow you to use specific linking options, you do not need to modifiy
LD_LIBRARY_PATH

终难愈 2024-08-17 19:38:56

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

您可以通过将共享库的路径添加到 LD_LIBRARY_PATH 来完成此操作。在这种情况下,这将是您为编译器提供 -L 参数的内容。

You need to tell the runtime c library where to find the various symbols that arent compiled statically in your code and arent in the usualy /lib and /usr/lib locations.

You do this by adding the path to your shared library to LD_LIBRARY_PATH. In this case, this will be what you have been putting for the -L argument to the compiler.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文