CMake & C++ ビルドメモ
目次
CMake
- 最新版のビルド・インストール方法
- CMakeLitst.txt の例
- CMake マニュアル
- CMake の書き方
実行方法
-
ビルド・インストール
mkdir build && cd build cmake .. && make -j$(nproc) sudo make install
CMake>=3.15からは以下が可能
mkdir ./project/build cmake -S ./project -B ./project/build cmake --build ./project/build sudo cmake --install ./project/build
その他詳細はこちら
-
アンインストール:
xargs sudo rm -rf < install_manifest.txt
単一ファイルの場合
# CMake のバージョン指定
# 3.8 では Google Test に関する機能が使える
cmake_minimum_required(VERSION 3.8.0)
project(Main)
add_executable(Main main.cpp)
# コンパイルオプション指定
target_compile_options(Main PUBLIC -O2 -Wall)
# 特定の機能を持つバージョンを指定
# cf. http://tinyurl.com/y48o2xhh
target_compile_features(Main PUBLIC cxx_std_11)
階層化プロジェクトのビルド
- プロジェクト階層:
project
├ include
│ └ sub.h
├ src
│ ├ sub.cpp
│ └ CMakeLists.txt
├ test
│ ├ test.cpp
│ └ CMakeLists.txt
├ main.cpp
└ CMakeLists.txt - /project/CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
project(Main)
add_executable(Main main.cc)
target_compile_options(Main PUBLIC -O2 -Wall)
target_compile_features(Main PUBLIC cxx_std_11)
# サブディレクトリのプロジェクトを追加してリンク
add_subdirectory(src)
target_link_libraries(Main PUBLIC Sub)
# テストを有効化
enable_testing()
add_subdirectory(test)
- /project/src/CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
add_library(Sub SHARED sub.cpp)
# ヘッダファイルのフォルダを指定
target_include_directories(Sub PUBLIC
${PROJECT_SOURCE_DIR}/include
)
- /project/test/CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
include(GoogleTest)
add_library(GTest
SHARED ${PROJECT_SOURCE_DIR}/test/gtest/gtest-all.cc
)
target_include_directories(GTest
PUBLIC ${PROJECT_SOURCE_DIR}/test
)
add_library(GMain
SHARED ${PROJECT_SOURCE_DIR}/test/gtest/gtest_main.cc
)
target_include_directories(GMain
PUBLIC ${PROJECT_SOURCE_DIR}/test
)
add_executable(SolverTest solver_test.cc)
target_compile_options(SolverTest PUBLIC -O2 -Wall)
target_compile_features(SolverTest PUBLIC cxx_std_11)
target_link_libraries(SolverTest
PUBLIC
GTest
GMain
)
gtest_add_tests(TARGET SolverTest)
コマンドラインでのビルド
- 基本のコマンド:
gcc main.cpp -o out
- コンパイラオプション
- Tips
- Suffix Alias (fo Zsh)
- 拡張子に応じてコマンドを実行してくれるエイリアス(Zsh 限定)
function runcpp () {
g++ -O2 $1
shift
./a.out $@
}
# Suffix Alias
alias -s {c,cpp}='runcpp'
# コンパイル
./main.cpp