2013-02-15 30 views
11

Gần đây, tôi đã cài đặt thư viện hdf5 trên máy ubuntu và hiện đang gặp sự cố khi liên kết với các chức năng được xuất. Tôi đã viết một kịch bản thử nghiệm đơn giản readHDF.cpp để giải thích vấn đề này:lỗi biên dịch g ++: không xác định tham chiếu đến hàm thư viện được chia sẻ tồn tại

#include <hdf5.h> 

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

Lệnh compile là

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

mà trả về lỗi sau

/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 

Tôi đang bối rối vì lệnh nm dường như cho biết chức năng đã được xuất:

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

trả về

0000000000034349 T H5check_version 

và một kết quả tương tự cho H5Fopen. Bất kỳ suy nghĩ về những gì có thể sẽ sai? Bạn không chắc chắn nếu nó giúp, nhưng nếu tôi nhận xét ra phần H5Fopen của kịch bản, sau đó nó biên dịch tốt:

#include <hdf5.h> 

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

Cũng có nhiều phiên bản của hdf5 cài đặt trên máy chủ được sử dụng bởi các module python khác nhau như h5py và bảng, nhưng tôi không thể nhận được bất kỳ của họ để làm việc, vì vậy tôi đã cài đặt phiên bản này trong thư mục địa phương của tôi và thay đổi các tùy chọn rpath cho g + + linker.

Trả lời

26

Ok, giải quyết. Vấn đề nằm ở vị trí của lệnh -lhdf5 trong lệnh biên dịch. Rõ ràng -lhdf5 nên được đặt sau readHDF.cpp. Ví dụ: g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5 sẽ biên dịch không có vấn đề gì, nhưng g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp sẽ không thành công với các lỗi tham chiếu không xác định. Thật thú vị, đây chỉ là một vấn đề đối với Ubuntu 12.04, vì cả hai lệnh biên dịch đều làm việc cho Ubuntu 10.04.

Tìm thấy câu trả lời với lời giải thích tại bài đăng này:

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

Tôi đoán đặt -lXXX sau khi kịch bản là thực hành an toàn hơn.

+0

Lạ. Đặt '-lhdf5' trước tập lệnh và mọi thứ hoạt động tốt. Khi tôi đặt nó sau khi kịch bản, nó cung cấp cho các thư viện lỗi. – Mathias711

+1

Tôi không thể upvote đủ. Cảm ơn! – stormbreaker

+0

+500 nếu tôi có thể – johnjg12

0

Bạn quên đặt -lhdf5 trong lệnh biên dịch. Ngoài ra, không cần cho -l:$HOME/hdf5/lib/libhdf5.so

này nên làm việc: $ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp

+0

tôi đã cố gắng mà ban đầu và nó đã cho các lỗi tương tự. Có nhiều phiên bản libhdf5.so * trong $ HOME/hdf5/lib chẳng hạn như libhdf5.so.6 và libhdf5.so.6.0.3 v.v. vì vậy tôi cho rằng việc cụ thể hơn sẽ hữu ích, nhưng không. – dermen

+0

Và còn về -lhdf5 thì sao? Tôi có thể tạo lại lỗi liên kết chính xác mà bạn có trong câu hỏi của mình trên máy của mình và thêm -lhdf5 giải quyết vấn đề. –

+0

Vâng, việc thêm lệnh -lhdf5 không hiệu quả. Đó là một lỗi rất lạ. Tôi đã cài đặt chính xác theo cách tương tự trên máy Ubuntu 10 và nó hoạt động tốt. – dermen

Các vấn đề liên quan