Introduction

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

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

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

Explanation

まずは、CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

1
2
3
4
5
6
7
8
9
10
11
#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のパスは通っているものとします。

1
2
3
4
5
6
7
8
$ 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/CMake/01_CMake1