Boostライブラリを使用するUbuntu 11.10でプログラムをコンパイルしようとしています。 Ubuntuリポジトリから1.46-dev Boostライブラリをインストールしていますが、プログラムのコンパイル時にエラーが発生します。
undefined reference to boost::system::system_category()
私が間違っているのは何ですか?
使用しているブーストライブラリは、boost_systemライブラリに依存します。 (すべてがそうするわけではありません。)
Gccを使用する場合、そのライブラリに対してリンクするために、コンパイラコマンドラインに-lboost_system
を追加してみてください。
欠落しているシンボル(-lboost_system
)を定義するライブラリとリンクすることは明らかな解決策ですが、Boost.Systemの特定のケースでは、元のデザインの機能不全により、boost::system::generic_category()
およびboost::system::system_category()
が不必要に使用されます。フラグ-DBOOST_SYSTEM_NO_DEPRECATED
を使用してコンパイルすると、そのコードが無効になり、-lboost_system
を必要とせずに多数のプログラムをコンパイルできます(ライブラリの機能の一部を明示的に使用する場合、リンクはもちろん必要です)。
Boost 1.66および this commit から開始して、この動作がデフォルトになったため、この回答を必要とするユーザーの数はますます少なくなっています。
@AndrewMarshallが気づいたように、代替手段は、コードのヘッダーのみのバージョンを有効にするBOOST_ERROR_CODE_HEADER_ONLY
を定義することです。ただし、これは一部の機能を破壊する可能性があるため、Boostによる discouraged です。
上記のエラーはリンカエラーです...リンカ コンパイラによって生成された1つ以上のオブジェクトを取得し、それらを1つの実行可能プログラムに結合するプログラム
ライブラリlibboost_system.so
内のboost::system::system_category()
などのシンボルを探す必要があることをリンカーに示す '-l boost_system'をリンカーフラグに追加する必要があります。
Main.cppがある場合、次のいずれか:
g++ main.cpp -o main -lboost_system
OR
g++ -c -o main.o main.cpp
g++ main.o -lboost_system
シバン全体を必要としない人のための別の回避策:スイッチを使用する
-DBOOST_ERROR_CODE_HEADER_ONLY
。
CMakeを使用する場合、add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
です。
CMAKEとfind_packageを使用するときは、次のことを確認してください。
find_package(Boost COMPONENTS system ...)
ではなく
find_package(boost COMPONENTS 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
詳細については、 ブースト1.51: "エラー:boost_threadに対してリンクできませんでした!" を参照してください。
...メインを静的にリンクしたい場合は、Jamfileで要件に次を追加します。
<link>static
<library>/boost/system//boost_system
そしておそらくまた:
<linkflags>-static-libgcc
<linkflags>-static-libstdc++