xerces-c 2.8:加载共享库时出错
我正在尝试编译在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
运行 ldd a.out 并查看链接器是否可以解析正确的 .so 文件
导出 LD_LIBRARY_PATH 来包含当前文件夹(与 PATH 变量相同的方式)并检查再次ldd
run
ldd a.out
and see if the linker can resolve the right .so fileexport
LD_LIBRARY_PATH
to include the current folder (in the same manner as the PATH variable) and check ldd again执行您想要的操作的好方法是以下一种:
或者
Xlinker 或 Wl 选项允许您使用特定的链接选项,您不需要修改
LD_LIBRARY_PATH
the good way to do what you want is the following one:
or
Xlinker or Wl options allow you to use specific linking options, you do not need to modifiy
LD_LIBRARY_PATH
您需要告诉运行时 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.