C++開発用に次のセットアップがあります。
OS X Yosemite
CLion 140.2310.6
(ビルドシステムとしてCMake
を使用するJetBrainsによるクロスプラットフォームC/C++-IDE)boost
をbrew 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_library
とtarget_link_libraries
も使用してみましたが、どれもプロジェクトを正常にビルドできませんでした。
CLion C++プロジェクトにboost
s機能を含めることができることを確認する方法を誰かが正しい方向に指摘できますか?
更新: @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 ")
午後全体を問題に費やした後、私はそれを自分で解決しました。それはかなり馬鹿げた間違いであり、@ Waxoの答えのすべてのヒントは本当に役に立ちました。
test.cpp-file内で#include <boost>
を書いたのがうまくいかなかった理由は、明らかに間違っています。代わりに、実際にインクルードするヘッダーファイルを直接参照する必要があるため、たとえば#include <boost/thread.hpp>
。
結局、boost
をCMake
プロジェクトに正常に(プラットフォームに依存せずに)含めるには、短い一連のステートメントで十分です。
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()
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()