2009-03-13 12 views
1

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);

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

Répondre

1

Une solution rapide est d'ajouter /home/install/x86_64/lib/libquicknet3.a à g ++ commandline. Si vous voulez chercher plus loin, si g ++ choisit une autre copie de libquicknet3, vous pouvez passer de -v à g ++ pour qu'il affiche ses chemins de recherche.

+0

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 :) –

+0

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

+0

Avec l'option -v, vous devez regarder LIBRARY_PATH et collect2 invocation. 'g ++ ... 2> & 1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael

3

je remarque que vous mixez FILE* et _IO_FILE*. Je ne suis pas familier avec ce dernier, êtes-vous sûr qu'ils sont un et la même chose?

+0

Pas vraiment, mais si c'était le problème, le message d'erreur ne ressemblerait-il pas plus à "aucune fonction correspondante pour l'appel ..."? Quoi qu'il en soit, la suggestion d'Aaron n'a pas fonctionné (lancer le FICHIER *) –

1

FICHIER est un typedef de _IO_FILE. Votre éditeur de liens le traite comme un type unique.

Vous pouvez essayer:

IN_PFILE = new QN_InFtrLabStream_PFile(0, "", (FILE *)fp, 1); 

pour voir si ce résoudre votre constructeur.

(fichier est défini dans stdio.h, _IO_FILE à libio.h si vous êtes intéressé)

+0

Salut, merci Aaron, j'ai essayé mais ça n'a pas marché. –

Questions connexes