web-dev-qa-db-ja.com

`boost :: program_options :: options_description :: m_default_line_length 'への未定義の参照

コードをコンパイルしようとしていますが、エラーが発生します

boost::program_options::options_description::m_default_line_lengthへの未定義の参照

Ubuntu 12.04でg ++を使用しています。私はいくつかのC++プログラミングを実行しましたが、Linux開発環境は初めてです(以前はIDEのみを使用していました)。

そこで、私はこの問題について基本的な検索を行い、いくつかのリンクの問題を見つけました。私は初心者なので、よくわかりませんでした。それらの解決策のいくつかを読んで、私はさらに混乱しました。ブーストライブラリフォルダーは/usr/includeにあります。いくつかの解決策は、それが/usr/libにあるべきだと言っています。しかし、ブーストフォルダーはありません。

何を変更する必要がありますか?

25
Picowhat

Repoからboostをインストールした場合は、_-lboost_program_options_を使用するだけで十分です。
ブーストライブラリを他のライブラリにインストールした場合は、そのディレクトリを_-L/path/to/lib_で指定する必要があります

CMakeではset(CMAKE_CXX_FLAGS "-lboost_program_options")を指定できます

しかしCMakeではあなたが使うべきです

_FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(target ${Boost_LIBRARIES})
_
29
Neel Basu

C++ 11標準の<string>クラスに変更があり、C++ 11以外のコンパイラ(G ++-4.8など)でコンパイルされたBoostライブラリのバージョンと競合する可能性があります。 boostを再コンパイルするか、Boostライブラリのコンパイルに使用されたバージョンのC++コンパイラを使用してみてください。

4
BlazePascal

また、プリプロセッサ変数_GLIBCXX_USE_CXX11_ABIの設定が、ブーストのコンパイルに使用された変数の設定と同じであることを再確認してください。変数のデフォルト設定は、Linuxディストリビューションおよび使用するGNUコンパイラーのバージョンによって異なります。

詳細は Dual ABI を参照してください。

2
sakra

ブーストライブラリ(.soおよび.aで終わるファイル)はどこにありますか?それらを見つけ、これをリンクコマンドに追加します。-L/path/to/boost/libs -lname-of-boost-lib

これは、C++を初めて起動するときに人々が直面する最も一般的な問題でなければなりません。 SOにはおそらく他に1000の未定義の参照質問があります。未定義の参照を検索するだけです。

0
anio

ライブラリは通常/usr/libにインストールされます(たとえば、私のシステムでは/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.58.0)。

これらのライブラリとリンクするコードをコンパイルするには、通常、/usr/includeで提供されるヘッダーファイルを使用します。

多くのライブラリーとは異なり、Boostにはpkg-configファイルが付属していないため、リンカーフラグを自分で追加する必要があります。通常のMakefileルールでは、LDLIBS += -lboost_program_optionsのようなものが必要になります。

libboost-devパッケージはprogram_optionsのヘッダーを提供しますが、対応するライブラリを取得するにはlibboost-program-options-devもインストールする必要があることにも注意してください。

0
Toby Speight