Boostライブラリを使用するUbuntu 11.10でプログラムをコンパイルしようとしています。Ubuntuリポジトリから1.46-dev Boostライブラリをインストールしましたが、プログラムをコンパイルするとエラーが発生します。
undefined reference to boost::system::system_category()
私が間違ったことは何ですか?
Boostライブラリを使用するUbuntu 11.10でプログラムをコンパイルしようとしています。Ubuntuリポジトリから1.46-dev Boostライブラリをインストールしましたが、プログラムをコンパイルするとエラーが発生します。
undefined reference to boost::system::system_category()
私が間違ったことは何ですか?
回答:
使用しているboostライブラリは、boost_systemライブラリに依存します。(それらのすべてが行うわけではありません。)
gccを使用していると仮定して、-lboost_system
そのライブラリーにリンクするためにコンパイラーのコマンドラインに追加してみてください。
-lboost_system
したので、次のようになりましたsslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
。しかし、それは役に立ちませんでした...
sslsniff_LDFLAGS
がsslsniff_LDADD
、うまくいきませんでした。次に、両方を保持しsslsniff_LDFLAGS
て追加しましたsslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
。その後、コンパイルすることができました。お手伝いありがとう!
欠落シンボル(定義ライブラリとリンクする-lboost_system
)明白な解決策であるが、Boost.Systemの特定の場合では、元の設計における設計ミスは、それが使用することができるboost::system::generic_category()
とboost::system::system_category()
不。フラグ-DBOOST_SYSTEM_NO_DEPRECATED
を付けてコンパイルすると、そのコードが無効になり、多くのプログラムを必要とせずにコンパイルできます-lboost_system
(もちろん、ライブラリの機能の一部を明示的に使用する場合は、そのリンクが必要です)。
Boost 1.66 とこのcommitから、この動作がデフォルトになりました。この答えを必要とするユーザーが少なくなれば幸いです。
@AndrewMarshallが気づいたように、代替方法はBOOST_ERROR_CODE_HEADER_ONLY
、ヘッダーのみのバージョンのコードを有効にする定義です。Boostは一部の機能を破壊する可能性があるため、これは推奨されませんでした。ただし、1.69以降、header-only がデフォルトになっているようで、おそらくこの質問は廃止されています。
BOOST_ERROR_CODE_HEADER_ONLY
でした。
シバン全体を必要としない人のための別の回避策:スイッチを使用する
-DBOOST_ERROR_CODE_HEADER_ONLY
。
CMakeを使用する場合はですadd_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
。
上記のエラーはリンカーエラーです...リンカーは、コンパイラーによって生成された1つ以上のオブジェクトを取得し、それらを単一の実行可能プログラムに結合するプログラムです。
ライブラリの-lboost_system
ようboost::system::system_category()
にシンボルを探す必要があることをリンカーに示すリンカーフラグを追加する必要がありますlibboost_system.so
。
main.cppがある場合、次のいずれかです。
g++ main.cpp -o main -lboost_system
または
g++ -c -o main.o main.cpp
g++ main.o -lboost_system
同じ問題が発生しました:
g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib -LD:/bfs_ENTW_deb/lib -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib \
D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
-o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47
D:/bfs_ENTW_deb/obj/test/main_filesystem.obj:main_filesystem.cpp :(。text + 0x54): `boost :: system :: generic_category()への未定義の参照
解決策は、system-libのデバッグバージョンを使用することでした。
g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib -LD:/bfs_ENTW_deb/lib -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib \
D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
-o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47
しかし、なぜ?
私がこの問題を抱えていたとき、原因はライブラリの順序付けでした。それを修正するために、私はlibboost_system
最後に置きました:
g++ mingw/timer1.o -o mingw/timer1.exe -L/usr/local/boost_1_61_0/stage/lib \
-lboost_timer-mgw53-mt-1_61 \
-lboost_chrono-mgw53-mt-1_61 \
-lboost_system-mgw53-mt-1_61
これは、gcc 5.3でmingwにあり、単純なタイマーの例で1.61.0をブーストしました。
私の場合、追加する-lboost_system
だけでは不十分で、カスタムビルド環境でそれを見つけることができませんでした。「gcc-/ usr / bin / ld:warning lib not found」の取得に関するアドバイスを使用して、./configure
コマンドを次のように変更する必要がありました。
./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME
詳細については、Boost 1.51を参照してください:「エラー:boost_threadにリンクできませんでした!」
...そしてメインを静的にリンクしたい場合は、Jamfileで以下を要件に追加します:
<link>static
<library>/boost/system//boost_system
そしておそらくまた:
<linkflags>-static-libgcc
<linkflags>-static-libstdc++