2009-03-13 37 views
1

コンパイル済みのライブラリとcppファイルをコンパイルしてリンクしていますが、 "定義されていない参照"エラーが発生しています。g ++未定義のコンストラクタへの参照

はまず、これは(問題のライブラリがquicknet3で、私はコンパイルしてるプログラムがトラッパーである)コマンドです:

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はであり、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するためにそれをインストール3210

したがって、trapper.cppからの呼び出しがこのコンストラクター定義への参照を見つけることができない理由を理解できません。 -L/home/install/x86_64/lib -lquicknet3のg ++​​引数は、このトリックを正しく行う必要がありますか?

アイデア?

おかげで、 ロイ

答えて

1

迅速な回避策は、G ++コマンドラインに/home/install/x86_64/lib/libquicknet3.aを追加することです(もし興味があるならFILEはlibio.hに_IO_FILE、stdio.hで定義されています)。

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

+0

これは機能します。しかし、なぜ??"-L/home/n4739094/install/x86_64/lib -lquicknet3"は/home/n4739094/install/x86_64/lib/libquicknet3.aとまったく同じ効果がありますか?私は-vを使ってみましたが、 "探索経路"の意味を理解できませんでした。ありがとう:) –

+0

-lquicknetを使用すると、リンカーにあなたのホームディレクトリを含むライブラリパスのlibquicknet3.aを検索すると、リンカが別のパスでコピーを使用していると思われます。残念ながら、gccドキュメントは手元にありません。検索順序はどれですか? – Ismael

+0

-vオプションを使用すると、LIBRARY_PATHおよびcollect2呼び出しを調べる必要があります。 'g ++ ... 2>&1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael

3

私はあなたがFILE*_IO_FILE*を混合していることに気づきます。私は後者に精通していない、彼らは確かに同じであると確信していますか?

+0

これは問題であったとしても、エラーメッセージは「no matching function for call ...」のようにはなりませんか?とにかく、Aaronの提案はうまくいかなかった(FILE *へのキャスト) –

1

FILEは、_IO_FILEのtypedefです。あなたのリンカーはそれをユニークな型として扱っています。

あなたは試みることができる:

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

をこれはあなたのコンストラクタを解決するかどうかを確認します。

+0

こんにちは、Aaronに感謝しましたが、これを試しましたが動作しませんでした。 –

関連する問題