CMakeの出力を「bin」ディレクトリにするにはどうすればよいですか?


187

現在、プラグイン構造でプロジェクトを構築しています。CMakeを使用してプロジェクトをコンパイルしています。プラグインは別のディレクトリにコンパイルされます。私の問題は、CMakeがバイナリとプラグイン、動的ライブラリをコンパイルしてソースのディレクトリ構造に保存することです。CMakeでファイルを./binディレクトリなどに保存するにはどうすればよいですか?

回答:


301

Olegの答えのように、設定する正しい変数はCMAKE_RUNTIME_OUTPUT_DIRECTORYである思います。ルートCMakeLists.txtで以下を使用します。

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

ターゲットごとに出力ディレクトリを指定することもできます。

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

どちらの場合も、あなたは追加することができ_[CONFIG]、出力ディレクトリは(設定するための標準的な値は、特定の構成に適用するために、変数/プロパティ名にDEBUGRELEASEMINSIZERELおよびRELWITHDEBINFO)。


8
RUNTIME_OUTPUT_DIRECTORYターゲットプロパティを設定することで、ターゲットごとにこれをオーバーライドすることもできます。ここではドキュメントを参照してください:cmake.org/cmake/help/...
DLRdave

4
DLRdaveのリンクは無効です。cmake.org/cmake/help/v2.8.8/…を
Nicu Stiurca

一度にすべての構成に適用するにはどうすればよいですか?
emlai

最初の3つのコマンドは、すべての構成に適用する必要があります(具体的には、CMAKE_RUNTIME_OUTPUT_DIRECTORYを設定する)。デバッグ出力用に別のディレクトリが必要な場合は、CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG(たとえば)のみを設定します。正確な動作は、使用しているジェネレーター/ツールチェーンによって異なります(たとえば、Visual Studioプロジェクトファイルにはすべての構成が1つのビルドツリーに含まれますが、makefileジェネレーターは1つのビルド構成のメイクファイルのみを生成します)。
Adam Bowen

1
CMAKE_ARCHIVE_OUTPUT_DIRECTORYコマンドがinstall(TARGETS <target_name>)まだ「実行可能ターゲットの実行時の宛先が指定されていません」について不平を言っていることを考慮して、を設定する目的は何ですか?この変数はおそらくデフォルト値を提供するので、installコマンドはの不在について文句を言うべきではありませんRUNTIME DESTINATION
thiagowfx 2017年

30

使用する set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
変数値としてディレクトリへのフルパス名を使用し、値の末尾に「/」を入れないでください... Adam Bowenの回答のように。
DLRdave

4
フルパスを追加する必要があるのはなぜですか?プロジェクトを移動するのは
面倒

8

EXECUTABLE_OUTPUT_PATHCMake変数を使用して、必要なパスを設定します。詳細については、オンラインのCMakeドキュメントを参照してください。

CMake 2.8.8ドキュメント


15
EXECUTABLE_OUTPUT_PATHは現在も機能しますが、この結果を達成するための「古い」方法です。Adam Bowenの答えは、推奨されるアプローチです。
DLRdave

4

私はcmake 3.5を使用していますが、以下(set variable)は機能しません。

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

しかし、これは機能します(set set_target_properties):

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

2
私はそれが私のような初心者のための重要な注意だと思うの実行可能ファイルなど、私はセット(CMAKE _...とアダムの答えを使用していますが、それは動作しますが、あなたはライブラリを追加する前にそれを行うときにのみ。
ashrasmun

ワオ。@ashrasmunは、数時間後に私を狂気から救いました。これらのコマンドの順序が非常に関連していることに気づくまでは、何も機能していませんでした。
節足動物

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

英語は私の母国語ではありません。入力ミスをお許しください。

この行構成を使用し
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
ます。CMakeLists.txtプロジェクトを配置します。
この$ {PROJECT_SOURCE_DIR}は、プロジェクトが配置される現在のソースディレクトリです。
そして、なぜ{{EXECUTABLE_OUTPUT_PATH}であるかわからない場合は、
このファイルを確認してからCMakeCache.txt、キーワードを検索しますoutput path
すべての変数がここで定義します。プロジェクトの完全な説明がすべて表示されます。 setting·



0

これをメインのCMakeLists.txtで定義するか、個々のCMakeLists.txtで定義するかに関係なく、メインパスからすべてのライブラリとビンを必要とすることを前提としています。


0

これに追加するには:

あなたが生成するCMAKEを使用している場合のVisual Studioソリューションを、あなたが望むのVisual Studioをに/ binに出力コンパイルされたファイルに、ピーターの答えは少し変更する必要があります。

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.