2013-02-15 87 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

相關問題