glog
ライブラリ (コードで使用されていない Google のロギング ライブラリ) を使用して単純な C++ プログラムをビルドすると、 「未定義の参照」エラーが発生します。-lglog
ビルド コマンドからを削除すると、リンクは成功します。
リンクに追加したライブラリがコードでまったく使用されていないことに注意してください。それにもかかわらず、ビルドが失敗しました。さらに、ライブラリglog
とlog4cpp
ライブラリは独立していると想定されています。
この異常な動作を説明できますか?
環境: Ubuntu 14.04
コード:
//test.cpp
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
int main() {
log4cpp::Appender *appender;
appender = new log4cpp::FileAppender("default", "program.log");
return 0;
}
作業ビルド コマンド:
$ g++ test.cpp -llog4cpp -lpthread
ビルド コマンドの失敗:
$ g++ test.cpp -llog4cpp -lglog -lpthread
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_create'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_getspecific'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_delete'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_setspecific'
collect2: error: ld returned 1 exit status
編集:
このコマンドも正常にビルドされます。
g++ test.cpp -llog4cpp -lpthread -lglog
このコマンドは失敗します (ライブラリの順序を変更します):
$ g++ test.cpp -llog4cpp -lglog -lpthread
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_create'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_getspecific'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_delete'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_setspecific'
collect2: error: ld returned 1 exit status
これは成功します:
$ g++ test.cpp -pthread -llog4cpp
これは失敗します:
$ g++ test.cpp -pthread -llog4cpp -lglog
編集2:
重複した提案(1) と(2)を調べて、そこに何か役立つものがあるかどうかを調べましたが、これらのケースはコードで使用されていないライブラリが追加された状況に対処していないため、無関係であることが判明しましたリンクを失敗させます。
編集3:
私の環境のファイル (glog ライブラリ、log4cpp ライブラリ、log4cpp ヘッダーと test.cpp を使用): log_test.zip。