2017-09-22 2 views
1

Es ist mein Verständnis, dass auf das Verzeichnis verweisen sollte, in dem Binärdateien für die aktuelle CMakeLists.txt-Datei platziert werden. Dies scheint jedoch nicht der Fall zu sein.Warum werden Binärdateien nicht in CMAKE_CURRENT_BINARY_DIR platziert?

diese Dateistruktur vor:

CMakeTest 
+- CMakeLists.txt 
+- main.cpp 

CMakeLists.txt

cmake_minimum_required(VERSION 3.2) 
add_executable(CMakeTest main.cpp) 
message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}") 

main.cpp

#include <iostream> 

int main() { 
    std::cout << "Hello, World!"; 
    return 0; 
} 

Auf der (Windows) Befehlszeile Ich betreibe folgende Befehle: die Linie

md build 
cd build 
cmake .. -G "Visual Studio 14 2015" 
cmake --build . 

Die ersten cmake Befehl druckt (unter anderem)

CMAKE_CURRENT_BINARY_DIR = X:/dev/projects/CMakeTest/build

Also würde ich erwarten Die resultierende Binärdatei CMakeTest.exe endet dort. Wirklich, aber es ist in X platziert:/dev/projects/CMakeTest/Build/Debug.

Warum wird die Binärdatei nicht in platziert, aber in einem Unterverzeichnis? Und gibt es eine CMake-Variable, die mir sagt, was dieses Unterverzeichnis ist?

Edit:

Ich versuche nicht zu Änderung das Verzeichnis, in dem Binär-Dateien platziert werden. Ich versuche es zu bestimmen. Der Grund dafür ist:

Während des Builds wird eine Anzahl zusätzlicher Ressourcendateien im selben Verzeichnis wie die ausführbare Datei erstellt. (Dieser Teil funktioniert.) Ich möchte den Befehl install(FILES, ...) verwenden, um diese Dateien dann zum resultierenden Paket hinzuzufügen. Also muss ich den tatsächlichen Pfad übergeben, wo die Binärdateien platziert werden install(FILES, ...).

+0

Ich denke, das ist ein Manko des MSVC-Generators. – arrowd

+0

Ich glaube, das ist eine gute Sache .. Ich meine mit Debug und Release ausführbar inkompatibel und wahrscheinlich benannt das gleiche sein Bestes, um sie in separaten Ordnern zu halten. Denken Sie daran, dass Sie in MSVC standardmäßig 4 Konfigurationen haben. – drescherjm

+0

@arrowd: Es scheint kein Generatorproblem zu sein. Die Verwendung des Xcode-Generators unter OS X hat das gleiche Ergebnis. –

Antwort

1

Die Variable CMAKE_CURRENT_BINARY_DIR steht für "Binärverzeichnis wird derzeit verarbeitet" von CMake. Normalerweise enthält dieses Verzeichnis und seine Unterverzeichnisse Build Artefakte, wie ausführbare Dateien, Bibliotheken oder andere generierte Dateien.

Wenn Sie den Speicherort der ausführbaren Datei steuern möchten, die erstellt wird, müssen Sie die Variable CMAKE_RUNTIME_OUTPUT_DIRECTORY setzen.

Hinweis, dass multiconfiguration Build-Tools wie Visual Studio, für jede spezifische Konfiguration Unterverzeichnis wird unter CMAKE_RUNTIME_OUTPUT_DIRECTORY (als Konfiguration selbst genannt). Andernfalls überschreiben ausführbare Dateien, die für unterschiedliche Konfigurationen erstellt wurden, sich selbst.

Für genaue Steuerung pro konfigurationsverzeichnis verwendet für ausführbare ausführbare Dateien verwenden Variable CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG>. (Statt < CONFIG> Name spezifischer Konfiguration eingefügt werden soll, so CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG Variable beeinflussen Debug baut).


Für nur Verzeichnis mit ausführbaren bestimmen, verwenden $<TARGET_FILE_DIR:tgt>generator expression (statt tgt ein Name des Ziel erstellt die ausführbare Datei verwendet werden soll).

Beachten Sie, dass Generatorausdrücke nur an bestimmten Stellen verwendet werden können. Z. B. kann die Liste der Dateien für den Befehl install(FILES) Generatorausdruck verwenden, aber der Befehl message() kann nicht.

+0

Danke für deine Erklärung, @Tsyvarev. Ich fürchte, ich wusste nicht genau, was ich erreichen wollte. Ich habe einen "Edit:" - Absatz zu meiner Frage hinzugefügt. Es wäre toll, wenn Sie es sich ansehen könnten! –

+0

Sieht so aus, als ob Sie nach '$ ' generator expression suchen, siehe bearbeitete Antwort. – Tsyvarev

Verwandte Themen