CMake のビルドディレクトリ中での出力先#
CMake のビルドディレクトリでは、特にバイナリの出力先を指定しなければ CMAKE_CURRENT_BINARY_DIR
変数で表される個々のディレクトリにバイナリが出力される。しかし、そのままでは
生成した実行ファイルを実行するのにサブディレクトリまで行くのが面倒
Windows 環境では別のファイルに出力された dll が見つからないというエラーで実行ができない
といった問題が発生する。
そこで、次のような記述をルートの CMakeLists.txt に書く。
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/lib>)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/lib>)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/bin>)
すると、次のように各ファイルがビルドディレクトリ中の各サブディレクトリへ配置される。
種類 |
拡張子 |
CMake における分類 |
ディレクトリ |
---|---|---|---|
実行ファイル |
exe |
runtime |
bin |
共有ライブラリ |
dll |
runtime |
bin |
静的ライブラリ |
lib |
archive |
lib |
種類 |
拡張子 |
CMake における分類 |
ディレクトリ |
---|---|---|---|
実行ファイル |
(なし) |
runtime |
bin |
共有ライブラリ |
so |
library |
lib |
静的ライブラリ |
a |
archive |
lib |
Note
Windows と Ubuntu では共有ライブラリが別の分類になっている。
Hint
${CMAKE_BINARY_DIR}/bin
と $<1:${CMAKE_BINARY_DIR}/bin>
では一部の環境において出力先が異なる。
$<1:${CMAKE_BINARY_DIR}/bin>
のように generator expression を使用することで、環境に依らない一定のディレクトリ構造を保つことができる。(参考:RUNTIME_OUTPUT_DIRECTORY — CMake 3.18.3 Documentation)