1

コンパイル済みのライブラリに対して 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
{
public:
QN_InFtrLabStream_PFile(int a_debug, const char* a_dbgname, FILE* a_file, int a_indexed);
(... 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) {
(... the usual constructor stuff :P ...) }

エラーなしで自分でquicknet3ライブラリをコンパイルし、/home/install/x86_64/lib/libquicknet3.aにインストールしました

そのため、trapper.cpp からの呼び出しでこのコンストラクター定義への参照が見つからない理由がわかりません。の g++ 引数で-L/home/install/x86_64/lib -lquicknet3うまくいくはずですよね?

何か案は?

ありがとう、ロイ

4

3 に答える 3

3

FILE*と が混ざっていることに気付きました_IO_FILE*。後者についてはよく知らないのですが、本当に同じものですか?

于 2009-03-13T10:30:16.517 に答える
1

簡単な回避策は、/home/install/x86_64/lib/libquicknet3.a を g++ コマンドラインに追加することです。

さらに調査したいのですが、g++ が libquicknet3 の別のコピーを選択している場合は、-v を g++ に渡して検索パスを出力することができます。

于 2009-03-13T13:02:21.020 に答える
1

FILE は の typedef です_IO_FILE。リンカーはそれを一意の型として扱っています。

あなたは試すことができます:

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

これがコンストラクターを解決するかどうかを確認します。

(FILE は stdio.h で定義され、_IO_FILE は libio.h で定義されています)

于 2009-03-13T12:23:05.230 に答える