Come faccio a rendere l'output di CMake in una directory 'bin'?


188

Attualmente sto costruendo un progetto con una struttura di plugin. Sto usando CMake per compilare il progetto. I plugin sono compilati in directory separate. Il mio problema è che CMake compila e salva i binari e i plugin, librerie dinamiche, nella struttura di directory del sorgente. Come posso fare in modo che CMake salvi i file in qualcosa come una directory ./bin ?

Risposte:


302

Come nella risposta di Oleg, credo che la variabile corretta da impostare sia CMAKE_RUNTIME_OUTPUT_DIRECTORY . Nella nostra radice CMakeLists.txt utilizziamo quanto segue:

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)

È inoltre possibile specificare le directory di output in base al target:

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 entrambi i casi è possibile aggiungere _[CONFIG]al nome della variabile / proprietà per rendere la directory di output si applicano a una configurazione specifica (i valori standard per la configurazione sono DEBUG, RELEASE, MINSIZERELe RELWITHDEBINFO).


8
Puoi anche sovrascriverlo per target impostando la proprietà target RUNTIME_OUTPUT_DIRECTORY. Vedi la documentazione qui: cmake.org/cmake/help/…
DLRdave

4
Il link di DLRdave è morto. Prova cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca,

Come renderlo applicabile a tutte le configurazioni contemporaneamente?
emlai,

I primi tre comandi dovrebbero applicarsi a tutte le configurazioni (specificando in particolare CMAKE_RUNTIME_OUTPUT_DIRECTORY). Impostare CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (ad esempio) solo se si desidera una directory diversa per l'output di debug. Il comportamento esatto dipende dal generatore / toolchain che si sta utilizzando (ad esempio i file di progetto di Visual Studio includono tutte le configurazioni in un albero di build, mentre il generatore di makefile genererà solo makefile per una configurazione di build).
Adam Bowen,

1
Qual è lo scopo dell'impostazione CMAKE_ARCHIVE_OUTPUT_DIRECTORY, considerando che il comando install(TARGETS <target_name>)si lamenta ancora di "nessuna DESTINAZIONE RUNTIME per destinazione eseguibile"? Questa variabile presumibilmente fornisce un valore predefinito, quindi il installcomando non dovrebbe lamentarsi dell'assenza di a RUNTIME DESTINATION.
thiagowfx,

30

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


10
Usa il nome completo del percorso nella directory come valore della variabile e non inserire un "/" finale nel valore ... come nella risposta di Adam Bowen.
DLRdave,

4
Perché è necessario aggiungere il percorso completo? Sembra un fastidio quando sposti il ​​tuo progetto ...
ScottF,

8

Utilizzare la EXECUTABLE_OUTPUT_PATHvariabile CMake per impostare il percorso necessario. Per i dettagli, consultare la documentazione online di CMake:

Documentazione CMake 2.8.8


15
EXECUTABLE_OUTPUT_PATH funziona ancora adesso, ma è il "vecchio" modo di raggiungere questo risultato. La risposta di Adam Bowen è l'approccio raccomandato.
DLRdave,

4

Quanto a me sto usando cmake 3.5, il seguito ( set variable) non funziona:

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

ma questo funziona ( 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
Sto usando la risposta di Adam con set (CMAKE _... e funziona, ma solo quando lo fai prima di aggiungere librerie, file eseguibili ecc. Penso che sia una nota importante per i principianti come me.
ashrasmun,

Wow. @ashrasmun mi ha salvato dal diventare pazzo dopo poche ore. Assolutamente nulla funzionava fino a rendersi conto che l'ordine di questi comandi è molto rilevante.
artropodo,

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

1

L'inglese non è la mia lingua madre; scusa gli errori di battitura.

usa questa riga config:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
posiziona qualsiasi tuo progetto CMakeLists.txt.
questo $ {PROJECT_SOURCE_DIR} è la directory di origine corrente in cui si trova il progetto.
e se vagare perché $ {EXECUTABLE_OUTPUT_PATH}
controlla questo file CMakeCache.txtquindi cerca la parola chiave output path,
tutte le variabili definite qui, darebbe una spiegazione completa del progetto 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
Potresti aggiungere qualche spiegazione alla tua risposta?
Paul Floyd,

0

Indipendentemente dal fatto che lo definisca nel CMakeLists.txt principale o in quelli individuali, si presume comunque che io voglia tutte le librerie e i bin fuori dal percorso principale, che è l'assunto meno utile di tutti.


0

Per aggiungere a questo:

Se stai usando CMAKE per generare una soluzione di Visual Studio e vuoi che Visual Studio produca i file compilati in / bin, la risposta di Peter deve essere leggermente modificata:

# 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 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.