2016-07-13 2 views
0

Je suis en train de compiler quelques fichiers C++ en utilisant g ++, le problème que ces fichiers dépend des deux bibliothèques libxml2 et GSL, whene je donne la commande de compilation
g++ -Wall -I/usr/include/libxml2 -lgsl main.cpp YUNucNet.cpp src/*.cpp -lxml2 -lmréférence non définie à `gsl_vector_free »

il alaways donner moi beaucoup d'erreur de liaison de référence non définie pour GSL

'/tmp/ccCJrl0t.o: In function `WnSparseSolve__Phi__solve: 
WnSparseSolve.cpp:(.text+0x24bc): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24cc): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24e9): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24ff): undefined reference to `gsl_vector_alloc' 
WnSparseSolve.cpp:(.text+0x250f): undefined reference to `gsl_vector_calloc 
....etc 

quel est le problème ici ??

+1

Possible duplicate of [Pourquoi l'ordre dans lequel les bibliothèques sont liées provoque-t-il parfois des erreurs dans GCC?] (Http://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries- are-linked-cause-errors-in-gcc) –

Répondre

1

La longue histoire courte: la bibliothèque -lgsl doit être après votre CPPS dans la ligne de commande, à savoir:

g++ -Wall -I/usr/include/libxml2 main.cpp YUNucNet.cpp src/*.cpp -lxml2 -lgsl -lm 

Vous pouvez appeler g ++ avec option -v pour voir ce qui se passe sous le capot, que vous verrez , que l'éditeur de liens est appelé avec -lgsl avant vos fichiers objet compilés. Ainsi, la bibliothèque -lgsl sera exécutée par l'éditeur de liens avant les fichiers objet et l'éditeur de liens supprimera toutes les fonctions de la bibliothèque car, jusqu'à présent, il ne sait pas qu'ils sont nécessaires. Ce n'est que plus tard, en travaillant à travers vos fichiers objet, que l'on saura que les fonctions de la bibliothèque sont effectivement nécessaires, mais qu'il est déjà trop tard.