克++编译错误:未定义的引用,其存在共享库函数(g++ compile error: undefin

2019-08-17 00:36发布

我最近安装了一个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;
}

还有一些被各种Python模块,如h5py和表使用安装在服务器上HDF5的多个版本,但我无法得到其中的任何工作,所以我安装了这个版本在我的本地目录,并改变了rpath的选项为克++接头。

Answer 1:

好了,解决了。 问题是在编译命令的-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。

发现这个帖子解释了答案:

未定义的参照符号,即使纳米指示该符号是本

我猜将-lXXX后的脚本更安全的做法。



Answer 2:

这是不是一个错误。 见C ++共享库未定义参考`FooClass :: SayHello的()”

“你把目标文件和库的顺序GCC reuqire的最新版本,他们互相依赖...”



Answer 3:

你忘了把-lhdf5在编译命令。 此外,还有没有必要-l:$HOME/hdf5/lib/libhdf5.so

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



文章来源: g++ compile error: undefined reference to a shared library function which exists