Je compile et lie un fichier cpp à une bibliothèque précompilée, et j'obtiens une erreur de "référence indéfinie".g ++ référence non définie au constructeur
Tout d'abord, est la commande (la bibliothèque en question est quicknet3, le programme que je suis la compilation est trappeur):
g++ -w -g -I. -g -O3 -pipe -Wall -I/home/install/x86_64/include/quicknet3 -L/home/install/x86_64/lib -lquicknet3 -lintvec -lfltvec -o trapper trapper.cpp CMyException.cpp
est ici l'erreur de référence non définie:
/tmp/ccFuVczF.o: In function 'main': trapper.cpp:1731: undefined reference to 'QN_InFtrLabStream_PFile::QN_InFtrLabStream_PFile(int, char const*, _IO_FILE*, int)'
L'appel dans trapper.cpp (ligne 1731) est:
IN_PFILE = new QN_InFtrLabStream_PFile(0, "", fp, 1);
où fp
est un FILE *
, affecté comme résultat d'un appel fopen
au préalable.
Le constructeur étant appelé est défini dans le fichier d'en-tête pertinent (QN_Pfile.h), comme suit:
class QN_InFtrLabStream_PFile : public QN_InFtrLabStream
{
public:
QN_InFtrLabStream_PFile(int a_debug, const char* a_dbgname, FILE* a_file, int a_indexed);
(... other declarations ...) }
La définition du constructeur est en effet donnée dans QN_Pfile.cc:
QN_InFtrLabStream_PFile::QN_InFtrLabStream_PFile(int a_debug,const char* a_dbgname, FILE* a_file, int a_indexed) : log(a_debug, "QN_InFtrLabStream_PFile", a_dbgname),file(a_file),indexed(a_indexed),buffer(NULL),sentind(NULL) {
(... the usual constructor stuff :P ...) }
Je compilé moi-même bibliothèque quicknet3, sans erreur, et installé à /home/install/x86_64/lib/libquicknet3.a
Donc, je ne comprends pas pourquoi l'appel de trapper.cpp est incapable de trouver la référence à cette définition de constructeur. Les arguments g ++ de -L/home/install/x86_64/lib -lquicknet3
devraient faire l'affaire, non?
Des idées?
Merci, Roy
Cela fonctionne. Mais pourquoi??Ne devrait pas "-L/home/n4739094/install/x86_64/lib -lquicknet3" ont exactement le même effet que /home/n4739094/install/x86_64/lib/libquicknet3.a? J'ai essayé d'utiliser -v mais je n'ai pas pu donner de sens à ses "chemins de recherche" - des indices? Merci :) –
En utilisant -lquicknet dit à l'éditeur de liens que recherche libquicknet3.a dans le chemin des bibliothèques, qui comprend votre répertoire personnel, je suppose que l'éditeur de liens utilise une copie dans un autre chemin, malheureusement les documents gcc à portée de main ne dites-moi quel est l'ordre de recherche. – Ismael
Avec l'option -v, vous devez regarder LIBRARY_PATH et collect2 invocation. 'g ++ ... 2> & 1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael