15

我最近在 ubuntu 机器上安装了hdf5库,现在无法链接到导出的函数。我写了一个简单的测试脚本readHDF.cpp来解释这个问题:

#include <hdf5.h>

int main(int argc, char * argv[])
{
  hid_t     h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
  return 0;
}

编译命令是

g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
    -L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp

返回以下错误

/tmp/cc6DXdxV.o: In function `main':  
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version'  
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen'  
collect2: ld returned 1 exit status

我很困惑,因为nm命令似乎说该函数已被导出:

nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version

返回

0000000000034349 T H5check_version

和类似的结果H5Fopen。对可能出了什么问题有任何想法吗?不确定它是否有帮助,但如果我注释掉H5Fopen脚本的一部分,那么它编译得很好:

#include <hdf5.h>

int main(int argc, char * argv[])
{
hid_t     h5_file_id;// = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}

服务器上还安装了多个版本的 hdf5,供各种 python 模块使用,例如 h5py 和表,但我无法让它们中的任何一个工作,所以我在本地目录中安装了这个版本并更改了 rpath 选项对于 g++ 链接器。

4

3 回答 3

35

好的,解决了。问题在于 -lhdf5 在编译命令中的位置。显然 -lhdf5 应该放在 readHDF.cpp 之后。例如g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5,将编译没有问题,但g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp会因未定义的引用错误而失败。有趣的是,这只是 Ubuntu 12.04 的问题,因为两个编译命令都适用于 Ubuntu 10.04。

在这篇文章中找到了带有解释的答案:

即使 nm 指示此符号存在,对符号的未定义引用

我想在脚本之后放置 -lXXX 是更安全的做法。

于 2013-02-16T22:26:11.230 回答
6

这不是错误。请参阅 C++ 共享库未定义对 `FooClass::SayHello()' 的引用

“最新版本的 GCC 要求您按照它们相互依赖的顺序放置目标文件和库......”

于 2014-03-25T00:51:08.130 回答
0

你忘了-lhdf5输入编译命令。另外,也不需要-l:$HOME/hdf5/lib/libhdf5.so

这应该有效:$ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp

于 2013-02-16T00:02:22.180 回答