CMakeを使用してC ++プログラムをBoostにリンクする方法


109

UbuntuでプログラムをBoostライブラリにリンクするには、CMakeファイルはどのように見えるべきですか?

実行中に表示されるエラーmake

main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length'

メインファイルは本当にシンプルです:

#include <boost/program_options/options_description.hpp>
#include <boost/program_options/option.hpp>
using namespace std;
#include <iostream>

namespace po = boost::program_options;

int main(int argc, char** argv) {

    po::options_description desc("Allowed options");
    desc.add_options()
        ("help", "produce help message")
        ;

    return 0;
}

私はなんとかやってきた。CMakeファイルに追加した唯一の行は次のとおりです。

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

回答:


150

CMakeでは、find_package必要なライブラリを見つけるために使用できます。通常FindBoost.cmake、CMakeのインストールと共にあります。

私が覚えている限りでは/usr/share/cmake/Modules/、一般的なライブラリ用の他の検索スクリプトと共にインストールされます。動作の詳細については、そのファイル内のドキュメントを確認してください。

私の頭の中の例:

FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )

ADD_EXECUTABLE( anyExecutable myMain.cpp )

TARGET_LINK_LIBRARIES( anyExecutable LINK_PUBLIC ${Boost_LIBRARIES} )

このコードがお役に立てば幸いです。


2
Kitwares Githubリポジトリから機能するリンクを追加しました。FindBoost.cmakeに関する公式ドキュメントへのリンクも追加
MOnsDaR

1
なぜ特に1.40をブーストするのですか?ライブラリの基本機能が変更されなくなったのはいつですか?
jgyou

6
なぜそうではないのですか?これは単なる例です...自分に最も適したものを記入してください
MOnsDaR

5
重要な詳細は、およびラインのtarget_link_libraries に配置することです。そのため、リンクされているすべてのコンポーネントがわかります。add_executable find_package
マーフィー、

52

以下は私の設定です:

cmake_minimum_required(VERSION 2.8)
set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1)
set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

add_executable(main main.cpp)
target_link_libraries( main ${Boost_LIBRARIES} )

7
Boost_LIBRARIESは完全修飾パスになるため、link_directoriesは必要ありません。
RobertJMaynard 14年

私の場合、link_directoriesが必要でした。
mgruber4 2018

25

@MOnsDaRの回答を、インポートされたターゲットを使用する最新のCMake構文に適合させると、次のようになります。

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

インポートされたターゲットによってすでに処理されているため、手動でインクルードディレクトリを指定する必要がないことに注意してくださいBoost::program_options


このターゲットアプローチの欠点は、BoostバージョンがCMakeバージョンより新しい場合、おそらく失敗します。The FindBoost.cmake最初にこれらがビルドされるのは、Boostバージョンが明示的にリストされている場合のみです。ある時点でこれは改善されるはずでしたが、CMake 3.10.2とBoost 1.66(brewからの最新のコピー)ではまだ失敗が見られます。
Henry Schreiner、2018

4
古い回答が多すぎて正しい答え(これ)を見つけるのが難しいため、stackoverflowが失敗し始めます。
Carlo Wood

3

どのBoostライブラリですか?それらの多くは純粋なテンプレートであり、リンクを必要としません。

これで、Boostプログラムのオプションが必要であることを示す具体的な例が実際に示されている(さらに、Ubuntuを使用していることがさらに示されている)ため、次の2つのことを行う必要があります。

  1. libboost-program-options-devリンクできるようにインストールしてください。
  2. cmakeに対してリンクするように伝えlibboost_program_optionsます。

私は主にMakefileを使用するので、ここに直接コマンドラインで使用します。

$ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options
$ ./bpo_ex1
$ ./bpo_ex1 -h
$ ./bpo_ex1 --help
$ ./bpo_ex1 -help
$

それは多くのことをしていないようです。

CMakeの場合、ライブラリのリストにboost_program_optionsを追加する必要があり、IIRCはで実行SET(liblist boost_program_options)しますCMakeLists.txt


11
CMakeのアドバイスは間違っており(承認された回答を参照)、CMakeに関する質問のため、コマンドラインのアドバイスはあまり役に立ちません。
Ela782 2014年

3

システムのデフォルトのインストールパスを使用する2つの方法、通常/usr/lib/x86_64-linux-gnu/

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}")
message("boost inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

Boostをローカルディレクトリにインストールするか、システムインストールではなくローカルインストールを選択した場合は、次のように実行できます。

set( BOOST_ROOT "/home/xy/boost_install/lib/" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}, inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

上記のディレクトリ/home/xy/boost_install/lib/がBoostをインストールする場所であることに注意してください:

xy@xy:~/boost_install/lib$ ll -th
total 16K
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 lib/
drwxrwxr-x 3 xy xy 4.0K May 28 19:22 include/

xy@xy:~/boost_install/lib$ ll -th lib/
total 57M
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 ./
-rw-rw-r-- 1 xy xy 2.3M May 28 19:23 libboost_test_exec_monitor.a
-rw-rw-r-- 1 xy xy 2.2M May 28 19:23 libboost_unit_test_framework.a
.......

xy@xy:~/boost_install/lib$ ll -th include/
total 20K
drwxrwxr-x 110 xy xy  12K May 28 19:22 boost/

ローカルにインストールされたBoostの使用方法に興味がある場合は、この質問を参照してください。CMakeで代替のBoostインストールを見つけるにはどうすればよいですか?


2

これが私の見解です:

cmake_minimum_required(VERSION 3.15)

project(TryOuts LANGUAGES CXX)

find_package(Boost QUIET REQUIRED COMPONENTS program_options)

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Boost Not found")
endif()

add_executable(helloworld main.cpp)

target_link_libraries(helloworld PUBLIC Boost::program_options)

target_link_libraries(helloworld PUBLIC Boost :: program_options)により、CMAKEエラーが発生します。 。おそらく、IMPORTEDターゲットのfind_package()コールが欠落しているか、またはALIASターゲットが欠落していますか?
munsingh

こんにちは、フィードバックをありがとう。CMakeがシステムでBoostを見つけられないようです。ソースからBoostの新しいビルドを作成する方がよいでしょう。でパッケージを検索します。あなたは次のことをしようとする場合がありますことをする前にfind_package(Boost QUIET REQUIRED):とあなたのターゲット(DB32)へのリンクtarget_link_libraries(DB32 PUBLIC Boost::headers)
ADEM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.