CMakeで実行ファイルの出力先を分けるときの設定
CMakeで複数ターゲットを作ると、実行ファイルやライブラリがどこに出るのか分かりづらくなることがあります。
build/app/my_app のようにディレクトリごとに分かれる構成もありますが、成果物をまとめたい場合は出力先を指定します。
実行ファイルの出力先
実行ファイルは RUNTIME_OUTPUT_DIRECTORY で指定できます。
add_executable(my_app
src/main.cpp
)
set_target_properties(my_app PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
これで実行ファイルは build/bin に出ます。
https://cmake.org/cmake/help/latest/prop_tgt/RUNTIME_OUTPUT_DIRECTORY.html
ライブラリの出力先
静的ライブラリと共有ライブラリは、それぞれ設定が分かれます。
add_library(my_lib
src/lib.cpp
)
set_target_properties(my_lib PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
| プロパティ | 対象 |
|---|---|
RUNTIME_OUTPUT_DIRECTORY |
実行ファイル、WindowsのDLL |
LIBRARY_OUTPUT_DIRECTORY |
共有ライブラリ |
ARCHIVE_OUTPUT_DIRECTORY |
静的ライブラリ |
共有ライブラリをWindowsでも扱うなら、DLLが RUNTIME 側に出る点を見ておきます。
全ターゲット共通にする場合
ターゲットごとに書くのが面倒なら、変数で全体のデフォルトを指定できます。
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
この設定は、その後に作られるターゲットの初期値として使われます。
https://cmake.org/cmake/help/latest/variable/CMAKE_RUNTIME_OUTPUT_DIRECTORY.html
すでに作ったターゲットには効かないため、書く位置には注意します。
installとは別の話
出力先の設定と install() は別です。
RUNTIME_OUTPUT_DIRECTORY はビルド時にどこへ出すか。
install() はインストール時にどこへ配置するか。
配布やCI成果物として整理したい場合は、出力先だけでなく CMakeで実行ファイルとライブラリをinstallするときの設定 も見ておくとよいです。
まとめ
CMakeで成果物の場所を揃えたい場合は、出力先プロパティを使います。
- 実行ファイルは
RUNTIME_OUTPUT_DIRECTORY - 共有ライブラリは
LIBRARY_OUTPUT_DIRECTORY - 静的ライブラリは
ARCHIVE_OUTPUT_DIRECTORY - 全体の初期値は
CMAKE_*_OUTPUT_DIRECTORY install()とは役割が違う
ビルド中の見通しをよくしたいなら出力先設定、配布先を決めたいならinstall設定、と分けて考えると整理しやすいです。


