2012-02-19 12 views
11

ho una molto semplice struttura di directory: fileCMake posizione eseguibile

Project 
Project/src 
Project/build 

Source sono in Project/src, e faccio la build out-of-src in Project/build. Dopo aver eseguito cmake ../ ; make, posso eseguire l'eseguibile in tal modo: Project/build$ src/Executable - ovvero, lo Executable viene creato nella directory build/src.

Come si imposta la posizione dell'eseguibile nel file CMakeLists.txt? Ho tentato di seguire alcuni degli esempi trovati a cmake.org, ma i collegamenti che funzionano non sembrano mostrare questo comportamento.

Il mio file Project/src/CMakeLists.txt è elencato qui.


include_directories(${SBSProject_SOURCE_DIR}/src) 
link_directories(${SBSProject_BINARY_DIR}/src) 

set (SBSProject_SOURCES 
    main.cpp 
    ) 

add_executable(TIOBlobs ${SBSProject_SOURCES}) 

E il primo livello Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6) 
project (SBSProject) 

set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 

add_subdirectory(src) 

risposta

16

avete un paio di scelte.

Per modificare la posizione predefinita dei file eseguibili, impostare CMAKE_RUNTIME_OUTPUT_DIRECTORY nella posizione desiderata. Ad esempio, se si aggiunge

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

al Project/CMakeLists.txtprima il comando add_subdirectory, vostro eseguibile finirà in Project/build per Unix costruisce o build/<config type> per Win32 costruisce. Per ulteriori informazioni, eseguire:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY 

Un'altra opzione per un progetto di queste dimensioni è quello di avere un solo CMakeLists.txt. È possibile sostituire più o meno add_subdirectory(src) con il contenuto di Project/src/CMakeLists.txt per ottenere gli stessi percorsi di output.

Tuttavia, ci sono un paio di ulteriori problemi.

Probabilmente si desidera evitare l'uso di link_directories in genere. Per una spiegazione, eseguire

cmake --help-command link_directories 

Anche se utilizzati link_directories, è improbabile che le librerie saranno trovati in ${SBSProject_BINARY_DIR}/src

Un altro problema è che la CMAKE_CXX_FLAGS applicano a Unix costruisce, quindi probabilmente dovrebbero essere avvolti in un blocco if (UNIX) ... endif(). Naturalmente, se non hai intenzione di creare qualcosa di diverso da Unix, questo è un non-problema.

Infine, vi consiglio di richiedere CMake 2,8 come minimo a meno che non si deve utilizzare 2,6 - CMake è un progetto attivamente sviluppato e la versione attuale ha molti miglioramenti significativi oltre 2,6

Quindi una sola sostituzione per Project/CMakeLists.txt potrebbe essere simile:

cmake_minimum_required (VERSION 2.8) 
project (SBSProject) 

if (UNIX) 
    set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 
endif() 

include_directories (${SBSProject_SOURCE_DIR}/src) 

set (SBSProject_SOURCES 
    ${SBSProject_SOURCE_DIR}/src/main.cpp 
    ) 

add_executable (TIOBlobs ${SBSProject_SOURCES}) 
2

Un altro modo di spostamento della posizione del file eseguibile è via set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)