A certain engineer "COMPLEX"

開発メモ その93 boostを使った最小のCMakeプロジェクト

Introduction


クロスプラットフォームのアプリケーションを作成するとき、CMakeは鉄板中の鉄板ですが、魔術のようなCMakeLists.txtを書くのはうんざりします。
Visual Studioならプロパティからヘッダーの参照、ライブラリの参照、という感じでスラスラ作業できますが。

そんな中クロスプラットフォームのコンソールアプリを作る必要に駆られたのでメモ。
ソースは下記になります

Sample source code for Demonstration, Experiment and Test - takuya-takeuchi/Demo

といっても、ソースそのものは本質では無く、CMakeLists.txtとboostの使い方が一番の肝。
特に、boostのパスを外部から指定してビルドするのがターゲットになります。

Explanation


まずは、CMakeLists.txt


cmake_minimum_required(VERSION 3.9.0)
set(PROJ_NAME Test)

project(${PROJ_NAME} VERSION 1.0.0)

# Select the release build type by default
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()

# target source and header files
# FILE(GLOB_RECURSE HEADERS ${PROJECT_SOURCE_DIR}/*.h)
# FILE(GLOB_RECURSE SOURCES ${PROJECT_SOURCE_DIR}/*.cpp)

include_directories(${BOOST_ROOT})

#add_executable(${PROJ_NAME} ${HEADERS} ${SOURCES})
add_executable(${PROJ_NAME} main.cpp)

set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MDd" "/MD" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

色々コメントがありますが、add_executableで実行ファイルを指定しているのと、include_directoriesでboostのパスを指定するのが肝。
特に、include_directoriesが無いと、cmakeコマンドにboostのパスを渡してもビルドに失敗します。

次に、main.cpp


#include <iostream>
#include <limits>
#include <boost/math/constants/constants.hpp>

int main ()
{
double pi = boost::math::constants::pi<double>();

std::cout.precision(std::numeric_limits<double>::max_digits10);
std::cout << pi << std::endl;
}

円周率を表示するだけです。

Build&Run


ビルドします。
CMakeLists.txtmain.cpが同じ階層にあるものとし、カレントディレクトリがCMakeLists.txtと同じだとします。
また、CMakeのパスは通っているものとします。


$ mkdir build
$ cd build
$ cmake -G "Visual Studio 14 2015 Win64" -DBOOST_ROOT=D:\Works\Lib2\boost\boost_1_59_0 -DBOOS
T_LIBRARYDIR=D:\Works\Lib2\boost\boost_1_59_0\lib64-msvc-12.0 ..
$ cmake --build . --config Release
$ cd Release
$ Test.exe
3.1415926535897931

上のような感じです。

Conclusion


意外とboost+CMakeの簡単なアプリという組み合わせが無くて困りました。
ましてや、boostのパスを外部から指定するタイプの完全なサンプルが無かったのです。
インストール済みのboostをfindするのはあったのですが。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/CMake1

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。