Erreur de compilation g ++: référence indéfinie à une fonction de bibliothèque partagée
J'ai récemment installé la hdf5 de la bibliothèque sur une machine ubuntu, et je suis maintenant de la difficulté à relier les fonctions exportées. J'ai écris un script de test readHDF.cpp pour expliquer le problème:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}
La commande de la compilation est
g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
-L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp
qui renvoie l'erreur suivante
/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
Je suis perplexe, parce que le nm commande semble dire que la fonction a été exporté:
nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version
qui renvoie
0000000000034349 T H5check_version
et un résultat similaire pour H5Fopen
. Des pensées sur ce qui pourrait mal se passer? Vous ne savez pas si cela aide, mais si je commente la H5Fopen
partie du script, puis il compile amende:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t h5_file_id;//= H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}
Aussi il y a plusieurs versions de hdf5 installé sur le serveur qui sont utilisés par les différents modules python comme h5py et les tableaux, mais je ne pouvais pas faire de à travailler, j'ai donc installé cette version dans mon répertoire local et changé le rpath options pour g++ linker.
source d'informationauteur dermen
Vous devez vous connecter pour publier un commentaire.
Ok, résolu. La question est dans le placement de l'-lhdf5 dans la commande de la compilation. Apparemment -lhdf5 doit être placé après readHDF.cpp. Par exemple
g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5
compile sans problèmes, maisg++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp
échoue avec l'indéfini d'erreurs de référence. Il est intéressant de noter, c'est seulement un problème pour Ubuntu 12.04, comme la compilation des commandes travaillé pour Ubuntu 10.04.Trouvé la réponse avec explication à ce post:
undefined reference to symbole même lorsque nm indique que ce symbole est présent
Je suppose placer -lXXX après le script est plus sûr de la pratique.
Ce n'est pas un bug. Voir
C++ de la bibliothèque partagée undefined reference to `FooClass::la méthode SayHello()'
"Les versions récentes de GCC reuqire que vous avez mis les fichiers objets et les bibliothèques dans l'ordre qu'ils dépendent les uns des autres ..."
Vous avez oublié de mettre
-lhdf5
dans la commande de la compilation. Aussi, il n'y a pas besoin de-l:$HOME/hdf5/lib/libhdf5.so
Cela devrait fonctionner:
$ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp