2013-02-15 10 views
11

Niedawno zainstalowałem bibliotekę na komputerze ubuntu i mam problemy z połączeniem z wyeksportowanymi funkcjami. Napisałem prosty skrypt testowy readHDF.cpp wyjaśnić kwestię:g ++ błąd kompilacji: niezdefiniowane odwołanie do funkcji biblioteki współdzielonej, która istnieje

#include <hdf5.h> 

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

Komenda kompilacji jest

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

która zwraca następujący błąd

/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 

Jestem zdezorientowany, ponieważ Komenda nm wydaje się mówić, że funkcja została wyeksportowana:

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

która zwraca

0000000000034349 T H5check_version 

i podobny wynik do H5Fopen. Jakieś myśli o tym, co może pójść nie tak? Nie wiem, czy to pomoże, ale jeśli mogę wypowiedzieć się część H5Fopen skryptu, a następnie kompiluje grzywny:

#include <hdf5.h> 

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

Ponadto istnieje wiele wersji zainstalowanej na serwerze hdf5, które są wykorzystywane przez różne moduły Pythona, takich jak h5py i tabele, ale nie mogłem uzyskać żadnego z nich do pracy, więc zainstalowałem tę wersję w moim lokalnym katalogu i zmieniłem opcje rpath dla g ++ linker.

Odpowiedz

26

Ok, rozwiązany. Problem polegał na umieszczeniu -lhdf5 w komendzie kompilacji. Podobno -lhdf5 powinno zostać umieszczone po readHDF.cpp. Na przykład g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5 skompiluje się bez problemów, ale g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp zakończy się niepowodzeniem z nieokreślonymi błędami odniesienia. Co ciekawe, był to tylko problem dla Ubuntu 12.04, ponieważ oba polecenia kompilacji działały dla Ubuntu 10.04.

znalazłem odpowiedź z wyjaśnieniem w tym poście:

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

Chyba umieszczenie -lXXX po skrypt jest bezpieczniejsze praktyki.

+0

Dziwne. Umieszczając '-lhdf5' przed skryptem i wszystko działa poprawnie. Po umieszczeniu go po skrypcie powoduje błędy bibliotek. – Mathias711

+1

Nie mogę tego zrobić wystarczająco. Dzięki! – stormbreaker

+0

+500 jeśli mogę – johnjg12

0

Użytkownik zapomniał umieścić -lhdf5 w komendzie kompilacji. Ponadto, nie ma potrzeby -l:$HOME/hdf5/lib/libhdf5.so

To powinno działać: $ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp

+0

Próbowałem że początkowo i dała ten sam błąd. Istnieje wiele wersji libhdf5.so * w $ HOME/hdf5/lib na przykład libhdf5.so.6 i libhdf5.so.6.0.3 itp., Więc to, że są bardziej szczegółowe, mogłoby pomóc, ale tak się nie stało. – dermen

+0

A co z -lhdf5? Mogę odtworzyć dokładny błąd linkera w twoim pytaniu na moim komputerze, a dodanie -lhdf5 rozwiązuje problem. –

+0

Tak, dodanie -lhdf5 nie pomogło. To bardzo dziwny błąd. Zainstalowałem dokładnie w taki sam sposób na komputerze Ubuntu 10 i działało dobrze. – dermen

Powiązane problemy