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 ?

Martin Kristiansen
quelle

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

Adam Bowen
quelle
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")

ovk
quelle
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

gtikok
quelle
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/"
)
Jayhello
quelle
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)
mcandre
quelle
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·

jdir.s
quelle
0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
Treffen Sie Modia
quelle
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.

Jerry Miller
quelle
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 )
serg06
quelle