g ++编译错误:对存在的共享库函数的未定义引用

时间:2013-02-15 23:48:04

标签: g++ shared-libraries ld hdf5 undefined-reference

我最近在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和table)使用,但我无法使其中任何一个工作,所以我在本地目录中安装了此版本并更改了g ++链接器的rpath选项。

3 个答案:

答案 0 :(得分:30)

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

在这篇文章中找到答案并解释:

undefined reference to symbol even when nm indicates that this symbol is present

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

答案 1 :(得分:5)

这不是错误。看到 C++ shared library undefined reference to `FooClass::SayHello()'

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

答案 2 :(得分: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