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


105

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

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

私が間違ったことは何ですか?


6
これはコンパイラエラーではなく、リンカエラーです。Boost.Systemライブラリにリンクする必要があります。
ildjarn

回答:


160

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

gccを使用していると仮定して、-lboost_systemそのライブラリーにリンクするためにコンパイラーのコマンドラインに追加してみてください。


3
コンパイルにはg ++ Makefileを使用しています。通常、そのようなフラグはどこに置くのですか?
user1049697 2012年

2
コンパイラー/リンカーのコマンドラインのアセンブル方法は、ケースごとに大きく異なります。Makefile(またはその関連部分)を質問に貼り付けませんか?そうすれば、特定のケースで機能する答えを得ることができます。
hc_

7
OK、Makefile.amを編集して追加-lboost_systemしたので、次のようになりましたsslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system。しかし、それは役に立ちませんでした...
user1049697

1
まだ同じエラーですか?autoreconfその後走った?また、この記事この一つは、あなたのautotoolsの設定であなたを助けるかもしれません。
hc_

2
Makefile.amで置き換えましたsslsniff_LDFLAGSsslsniff_LDADD、うまくいきませんでした。次に、両方を保持しsslsniff_LDFLAGSて追加しましたsslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp。その後、コンパイルすることができました。お手伝いありがとう!
user1049697 2012年

62

欠落シンボル(定義ライブラリとリンクする-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 がデフォルトになっているようで、おそらくこの質問は廃止されています。


4
ありがとう!!! 何も私が私を解放した唯一のものブースト1.41(CentOSにSL)を使用するので、助けない-DBOOST_SYSTEM_NO_DEPRECATED使用している
ロジャー・ラビット

5
実際に必要なのは-DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
興味深いことに、system_category()などへの参照が少ないという新しいBoost 1.66の動作は、リンクの順序付けの問題がある場合に新しいリンクの問題を引き起こす可能性があります。たとえば、github.com / PointCloudLibrary / pcl / pull / 2236を参照してください
pixelbeat

3
CMakeを使用する場合は、「add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)」を追加するだけ
nickolay

1
Boost 1.68で機能した唯一の修正は、定義することBOOST_ERROR_CODE_HEADER_ONLYでした。
サクラ

17

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

-DBOOST_ERROR_CODE_HEADER_ONLY

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


1
最近この問題に遭遇しました。これ以外は何も機能しません。マーク・グリッセの回答で述べられているように、これは後押しによってまだ落胆しているのだろうか。
John Z. Li

1
「Boost.Systemはヘッダーのみになりました。互換性のためにスタブライブラリが引き続き構築されていますが、リンクする必要はありません。」
John Z. Li

16

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

5
-lとライブラリ名の間のスペースが正しくありません。-lboost_system
portforwardpodcast

1
centosは-lの位置を気にしませんでしたが、ubuntuは最後に置かなければならないことに気付きました。
ask_io 2015年

7

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

find_package(Boost COMPONENTS system ...)

ではなく

find_package(boost COMPONENTS system ...)

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


6

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

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

しかし、なぜ?


1
どこかにデバッグフラグが定義されていた可能性がありますか?デバッグに組み込まれた他のライブラリまたはg ++がデバッグオブジェクトを生成していましたか?
noonex 2015年

4

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


1
これも私の問題でした。私はそれをCMakeを介して含めましたが、何らかの理由で、FindBoostスクリプトで想定される依存関係と順序付けが機能していました。しかし、実際には、私の問題は常に共有ライブラリを使用していて、注意を払っていなかったため、静的ライブラリに移行してビルドエラーが発生することでした。おっとっと。
アンソニー

これで修正されました...このソリューションの前は、BOOST_ERROR_CODE_HEADER_ONLYを定義することだけが機能していました。Ubuntu 18.04では、cmakeで1.68をブーストします。私の修正:target_link_libraries(実行可能なpthread ssl crypto boost_system)
Luis

2

私の場合、追加する-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にリンクできませんでした!」


1

...そしてメインを静的にリンクしたい場合は、Jamfileで以下を要件に追加します:

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

そしておそらくまた:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.