g ++ неопределенная ссылка на конструктор - PullRequest
1 голос
/ 13 марта 2009

Я компилирую и связываю файл cpp с предварительно скомпилированной библиотекой, и получаю ошибку «неопределенная ссылка».

Во-первых, это команда (рассматриваемая библиотека - quicknet3, программа, которую я компилирую, - trapper):

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

Вот неопределенная ошибка ссылки:

/tmp/ccFuVczF.o: In function 'main': trapper.cpp:1731: undefined reference to 'QN_InFtrLabStream_PFile::QN_InFtrLabStream_PFile(int, char const*, _IO_FILE*, int)'

Вызов в trapper.cpp (строка 1731):

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

, где fp - это FILE *, назначенный в результате предварительного вызова fopen.

Вызываемый конструктор определяется в соответствующем заголовочном файле (QN_Pfile.h) следующим образом:

class QN_InFtrLabStream_PFile : public QN_InFtrLabStream<br> {<br> public:<br> QN_InFtrLabStream_PFile(int a_debug, const char* a_dbgname, FILE* a_file, int a_indexed);<br> (... other declarations ...) }

Определение конструктора действительно дано в 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) {<br> (... the usual constructor stuff :P ...) }

Я сам без ошибок скомпилировал библиотеку quicknet3 и установил ее в /home/install/x86_64/lib/libquicknet3.a

Итак, я не могу понять, почему вызов trapper.cpp не может найти ссылку на это определение конструктора. Аргументы g ++ -L/home/install/x86_64/lib -lquicknet3 должны помочь, не так ли?

Есть идеи?

Спасибо, Рой

Ответы [ 3 ]

3 голосов
/ 13 марта 2009

Я заметил, что вы смешиваете FILE* и _IO_FILE*. Я не знаком с последним, вы уверены, что они одно и то же?

1 голос
/ 13 марта 2009

Быстрый обходной путь - добавить /home/install/x86_64/lib/libquicknet3.a в командную строку g ++.

Если вы хотите продолжить исследование, если g ++ выбирает другую копию libquicknet3, вы можете передать -v в g ++, чтобы он вывел свои пути поиска.

1 голос
/ 13 марта 2009

FILE - это typedef, равный _IO_FILE. Ваш компоновщик рассматривает его как уникальный тип.

Вы можете попробовать:

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

чтобы узнать, разрешит ли это ваш конструктор.

(FILE определяется в stdio.h, _IO_FILE в libio.h, если вам интересно)

...