2013-02-15 89 views
11

我最近在ubuntu机器上安装了hdf5库,现在无法链接到导出的函数。我写了一个简单的测试脚本readHDF.cpp来解释这个问题:g ++编译错误:未定义引用存在的共享库函数

#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模块,如使用服务器上安装的HDF5的多个版本h5py和tables,但是我无法让它们工作,所以我在我的本地目录中安装了这个版本,并更改​​了g ++链接器的rpath选项。

回答

26

好了,解决了。问题在于在编译命令中放置-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后的脚本更安全的做法。

+0

奇怪。在脚本之前加上'-lhdf5',一切正常。当我把它放在脚本之后时,它会给图书馆带来错误。 – Mathias711 2014-04-14 11:51:20

+1

我不能满足这个要求。谢谢! – stormbreaker 2014-10-09 13:20:11

+0

+500如果我可以 – johnjg12 2017-02-25 19:17:46

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

+0

“你把目标文件和库中,他们彼此依赖的顺序GCC reuqire ...的最新版本”我试图最初,它给了同样的错误。在$ HOME/hdf5/lib中有libhdf5.so *的多个版本,用于实例libhdf5.so.6和libhdf5.so.6.0.3等,所以我虽然更具体会有所帮助,但它没有。 – dermen 2013-02-16 00:10:04

+0

那么-lhdf5呢?我可以重现您的问题在我的机器上的确切链接器错误,并且添加-lhdf5可解决问题。 – 2013-02-16 01:51:29

+0

是的,添加-lhdf5没有帮助。这是一个非常奇怪的错误。我在Ubuntu 10机器上以完全相同的方式安装,并且工作正常。 – dermen 2013-02-16 18:29:41

相关问题