Wie mache ich die CMake-Ausgabe in ein 'bin'-Verzeichnis?


186

Ich baue gerade ein Projekt mit einer Plugin-Struktur. Ich verwende CMake, um das Projekt zu kompilieren. Die Plugins werden in separaten Verzeichnissen kompiliert. Mein Problem ist, dass CMake die Binärdateien und Plugins, dynamische Bibliotheken, in der Verzeichnisstruktur der Quelle kompiliert und speichert. Wie kann ich CMake veranlassen, die Dateien in einem ./bin-Verzeichnis zu speichern ?

Antworten:


298

Wie in Olegs Antwort glaube ich, dass die richtige Variable CMAKE_RUNTIME_OUTPUT_DIRECTORY ist . In unserer Root-Datei CMakeLists.txt verwenden wir Folgendes:

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)

Sie können die Ausgabeverzeichnisse auch pro Ziel angeben:

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"
)

In beiden Fällen können Sie hängen Sie _[CONFIG]an die Variable / Eigenschaftsnamen in das Ausgabeverzeichnis auf eine bestimmte Konfiguration (die Standardwerte für die Konfiguration sind gelten zu machen DEBUG, RELEASE, MINSIZERELund RELWITHDEBINFO).


8
Sie können dies auch auf Zielbasis überschreiben, indem Sie die Zieleigenschaft RUNTIME_OUTPUT_DIRECTORY festlegen. Siehe Dokumentation hier: cmake.org/cmake/help/…
DLRdave

4
Der Link von DLRdave ist tot. Versuchen Sie cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

Wie kann es auf alle Konfigurationen gleichzeitig angewendet werden?
Emlai

Die ersten drei Befehle sollten für alle Konfigurationen gelten (insbesondere das Festlegen von CMAKE_RUNTIME_OUTPUT_DIRECTORY). Sie würden CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (zum Beispiel) nur festlegen, wenn Sie ein anderes Verzeichnis für die Debug-Ausgabe wünschen. Das genaue Verhalten hängt vom verwendeten Generator / der verwendeten Toolchain ab (beispielsweise enthalten Visual Studio-Projektdateien alle Konfigurationen in einem Build-Baum, während der Makefile-Generator nur Makefiles für eine Build-Konfiguration generiert).
Adam Bowen

1
Was ist der Zweck der Einstellung CMAKE_ARCHIVE_OUTPUT_DIRECTORY, wenn man bedenkt, dass sich der Befehl install(TARGETS <target_name>)immer noch über "kein RUNTIME DESTINATION für ausführbares Ziel gegeben" beschwert? Diese Variable liefert angeblich einen Standardwert, daher sollte sich der installBefehl nicht über das Fehlen von a beschweren RUNTIME DESTINATION.
Thiagowfx

30

Verwenden set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
Verwenden Sie den vollständigen Pfadnamen zum Verzeichnis als Variablenwert und setzen Sie kein nachfolgendes "/" in den Wert ... wie in der Antwort von Adam Bowen.
DLRdave

4
Warum müssen Sie den vollständigen Pfad hinzufügen? Es scheint ärgerlich, wenn Sie Ihr Projekt verschieben ...
ScottF

8

Verwenden Sie die EXECUTABLE_OUTPUT_PATHVariable CMake, um den erforderlichen Pfad festzulegen. Weitere Informationen finden Sie in der Online-CMake-Dokumentation:

CMake 2.8.8 Dokumentation


15
EXECUTABLE_OUTPUT_PATH funktioniert derzeit noch, ist jedoch der "alte" Weg, um dieses Ergebnis zu erzielen. Die Antwort von Adam Bowen ist der empfohlene Ansatz.
DLRdave

4

Was mich betrifft, ich benutze cmake 3.5, das folgende ( set variable) funktioniert nicht:

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/"
)

aber das funktioniert ( 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
Ich verwende Adams Antwort mit set (CMAKE _... und es funktioniert, aber nur, wenn Sie es tun, bevor Sie Bibliotheken, ausführbare Dateien usw. hinzufügen. Ich denke, es ist ein wichtiger Hinweis für Anfänger wie mich.
Ashrasmun

Beeindruckend. @ashrasmun rettete mich nach ein paar Stunden vor dem Wahnsinn. Es hat absolut nichts funktioniert, bis festgestellt wurde, dass die Reihenfolge dieser Befehle sehr relevant ist.
Arthropode

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

1

Englisch ist nicht meine Muttersprache; Bitte entschuldigen Sie Tippfehler.

Verwenden Sie diese
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
Zeilenkonfiguration : Platzieren Sie ein beliebiges CMakeLists.txt-Projekt.
Dieses $ {PROJECT_SOURCE_DIR} ist Ihr aktuelles Quellverzeichnis, in dem sich das Projekt befindet.
und wenn wandern, warum $ {EXECUTABLE_OUTPUT_PATH} ist,
überprüfen Sie diese Datei CMakeCache.txtund suchen Sie dann das Schlüsselwort output path,
alle Variablen definieren hier, es würde eine vollständige Erklärung des Projekts alle geben setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
Könnten Sie Ihrer Antwort eine Erklärung hinzufügen?
Paul Floyd

0

Unabhängig davon, ob ich dies in der Haupt-CMakeLists.txt oder in den einzelnen definiere, wird immer noch davon ausgegangen, dass ich alle Bibliotheken und Bins vom Hauptpfad entfernen möchte, was die am wenigsten nützliche Annahme von allen ist.


0

Um dies zu ergänzen:

Wenn Sie mit CMAKE eine Visual Studio- Lösung generieren und Visual Studio kompilierte Dateien in / bin ausgeben soll, muss die Antwort von Peter ein wenig geändert werden:

# 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 )
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.