2012-02-19 25 views
11

Tengo una muy simple estructura de directorios: archivosCMake ubicación ejecutable

Project 
Project/src 
Project/build 

Fuente están en Project/src, y yo hacemos la acumulación fuera de src en Project/build. Después de ejecutar cmake ../ ; make, puedo ejecutar el ejecutable así: Project/build$ src/Executable - es decir, Executable se crea en el directorio build/src.

¿Cómo configuro la ubicación del ejecutable en el archivo CMakeLists.txt? Intenté seguir algunos de los ejemplos encontrados en cmake.org, pero los enlaces que funcionan no parecen mostrar este comportamiento.

Mi archivo Project/src/CMakeLists.txt figura en la lista aquí.


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

set (SBSProject_SOURCES 
    main.cpp 
    ) 

add_executable(TIOBlobs ${SBSProject_SOURCES}) 

Y el nivel superior Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6) 
project (SBSProject) 

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

add_subdirectory(src) 

Respuesta

16

usted tiene un par de opciones.

Para cambiar la ubicación predeterminada de los ejecutables, configure CMAKE_RUNTIME_OUTPUT_DIRECTORY en la ubicación deseada. Por ejemplo, si se agrega

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

a su Project/CMakeLists.txtantesadd_subdirectory el comando, el ejecutable va a terminar en Project/build para Unix construye o build/<config type> para Win32 construye. Para más detalles, ejecute:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY 

Otra opción para un proyecto de este tamaño es tener sólo una CMakeLists.txt. Podría reemplazar más o menos add_subdirectory(src) con los contenidos de Project/src/CMakeLists.txt para lograr las mismas rutas de salida.

Sin embargo, hay un par de problemas más.

Probablemente desee evitar el uso de link_directories en general. Para obtener una explicación, ejecute

cmake --help-command link_directories 

Incluso si usted utiliza link_directories, es poco probable que las bibliotecas se encuentran en ${SBSProject_BINARY_DIR}/src

Otra cuestión es que el CMAKE_CXX_FLAGS aplican a Unix construye, por lo que probablemente se deben envolver en un bloque if (UNIX) ... endif(). Por supuesto, si no está pensando en construir en otra cosa que no sea Unix, esto no es un problema.

Por último, me gustaría recomendar que requiere CMake 2.8, como mínimo, a menos que usted tiene que utilizar 2,6 - CMake es un proyecto desarrollado de forma activa, y la versión actual tiene muchas mejoras significativas más de 2,6

Así que un solo reemplazo para Project/CMakeLists.txt podría verse como:

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

Otra manera de volver a poner la ubicación del archivo ejecutable es a través de set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)

Cuestiones relacionadas