web-dev-qa-db-ja.com

CMakeを使用して外部ライブラリ(ブースト)をCLion C ++プロジェクトに含める方法

C++開発用に次のセットアップがあります。

  • OS X Yosemite
  • CLion 140.2310.6(ビルドシステムとしてCMakeを使用するJetBrainsによるクロスプラットフォームC/C++-IDE)
  • boostbrew install boost経由で/usr/local/Cellar/boost/にインストールしました

今、私の目標は、単純なプロジェクトをセットアップし、boostライブラリを含めることです。次のような1つのtest.cppファイルを定義しました。

#include <iostream>
#include <boost>

using namespace std;

int test() {
    cout << "Hello, World!" << endl;
    return 0; 
}

CMakeLists.txtファイルは次のようになります。

cmake_minimum_required(VERSION 2.8.4) 
project(MyProject)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

include_directories("/usr/local/Cellar/boost/1.57.0/include/boost")

set(SOURCE_FILES main.cpp ./test.cpp)
add_executable(MyProject ${SOURCE_FILES}) 

プロジェクトをビルドすると、次のエラーが表示されます。

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10:致命的なエラー:「ブースト」ファイルが見つかりません

make [3]:*** [CMakeFiles/MyProject.dir/test.cpp.o]エラー1 make [2]:*** [CMakeFiles/MyProject.dir/all]エラー2 make [1]:*** [CMakeFiles/MyProject.dir/rule]エラー2 make:*** [MyProject]エラー2

私はあちこちでパスを調整し、add_librarytarget_link_librariesも使用してみましたが、どれもプロジェクトを正常にビルドできませんでした。

CLion C++プロジェクトにboosts機能を含めることができることを確認する方法を誰かが正しい方向に指摘できますか?

更新: @Waxoの回答のおかげで、CMakeLists.txtファイルで次のコードを使用しました:

set(Boost_INCLUDE_DIR /usr/local/Cellar/boost/1.57.0)
set(Boost_LIBRARY_DIR /usr/local/Cellar/boost/1.57.0/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})

ファイルが見つかりません-errorを通過しましたが、代わりに次のようになります:

/ Applications/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685(ファイル)でのCMakeエラー:

ファイルSTRINGSファイル「/usr/local/Cellar/boost/1.57.0/boost/version.hpp」を読み取ることができません。

呼び出しスタック(最新の呼び出しが最初):CMakeLists.txt:11(find_package)

まだ不足しているアイデアはありますか? FindBoost.cmakeの参照行(685)は次のとおりです:file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

47
nburk

午後全体を問題に費やした後、私はそれを自分で解決しました。それはかなり馬鹿げた間違いであり、@ Waxoの答えのすべてのヒントは本当に役に立ちました。

test.cpp-file内で#include <boost>を書いたのがうまくいかなかった理由は、明らかに間違っています。代わりに、実際にインクルードするヘッダーファイルを直接参照する必要があるため、たとえば#include <boost/thread.hpp>

結局、boostCMakeプロジェクトに正常に(プラットフォームに依存せずに)含めるには、短い一連のステートメントで十分です。

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(BoostTest main.cpp)
target_link_libraries(BoostTest ${Boost_LIBRARIES})

これらの行はここで魔法をかけています。参考のために、ここに完全なCMakeLists.txtファイルを示します。これは、別のコマンドラインプロジェクトでデバッグに使用したものです。

cmake_minimum_required(VERSION 2.8.4)

project(BoostTest)

message(STATUS "start running cmake...")

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)

if(Boost_FOUND)

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
    message(STATUS "Boost_VERSION: ${Boost_VERSION}")

    include_directories(${Boost_INCLUDE_DIRS})

endif()

add_executable(BoostTest main.cpp)

if(Boost_FOUND)

    target_link_libraries(BoostTest ${Boost_LIBRARIES})

endif()
63
nburk

CMake find_package(Boost)を使用してみてください

src: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

動作はより良く、CMakeはクロスコンパイル用に作成されており、CMakeプロジェクトでは絶対パスを指定することは適切ではありません。

編集:

これも見てください: CMakeを使用してC++プログラムとBoostをリンクする方法

実際には、ブーストライブラリを実行可能ファイルにリンクしないためです。

通常、ブースト付きのCMakeは次のようになります。

set(Boost_USE_STATIC_LIBS        ON) # only find static libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.57.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
  target_link_libraries(foo ${Boost_LIBRARIES})
endif()
16
Waxo