web-dev-qa-db-ja.com

コンパイル時のboost :: system :: system_category()への未定義参照

Boostライブラリを使用するUbuntu 11.10でプログラムをコンパイルしようとしています。 Ubuntuリポジトリから1.46-dev Boostライブラリをインストールしていますが、プログラムのコンパイル時にエラーが発生します。

undefined reference to boost::system::system_category()

私が間違っているのは何ですか?

97
user1049697

使用しているブーストライブラリは、boost_systemライブラリに依存します。 (すべてがそうするわけではありません。)

Gccを使用する場合、そのライブラリに対してリンクするために、コンパイラコマンドラインに-lboost_systemを追加してみてください。

154
hc_

欠落しているシンボル(-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 です。

55
Marc Glisse

上記のエラーはリンカエラーです...リンカ コンパイラによって生成された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
15
user1055604

シバン全体を必要としない人のための別の回避策:スイッチを使用する

-DBOOST_ERROR_CODE_HEADER_ONLY

CMakeを使用する場合、add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)です。

15
Vadim Berman

CMAKEとfind_packageを使用するときは、次のことを確認してください。

find_package(Boost COMPONENTS system ...)

ではなく

find_package(boost COMPONENTS system ...)

一部の人々はそのために時間を失ったかもしれません...

7
Kriegalex

同じ問題が発生しました:

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

しかし、なぜ?

6
volker

この問題が発生したとき、原因はライブラリの順序付けでした。それを修正するために、最後に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のブーストでした。

4
Min Zhang

私の場合、-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に対してリンクできませんでした!" を参照してください。

2
jcomeau_ictx

...メインを静的にリンクしたい場合は、Jamfileで要件に次を追加します。

<link>static
<library>/boost/system//boost_system

そしておそらくまた:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
1
formiaczek