コンパイル済みのライブラリと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 ++引数は、このトリックを正しく行う必要がありますか?
アイデア?
おかげで、 ロイ
これは機能します。しかし、なぜ??"-L/home/n4739094/install/x86_64/lib -lquicknet3"は/home/n4739094/install/x86_64/lib/libquicknet3.aとまったく同じ効果がありますか?私は-vを使ってみましたが、 "探索経路"の意味を理解できませんでした。ありがとう:) –
-lquicknetを使用すると、リンカーにあなたのホームディレクトリを含むライブラリパスのlibquicknet3.aを検索すると、リンカが別のパスでコピーを使用していると思われます。残念ながら、gccドキュメントは手元にありません。検索順序はどれですか? – Ismael
-vオプションを使用すると、LIBRARY_PATHおよびcollect2呼び出しを調べる必要があります。 'g ++ ... 2>&1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael