2012-02-19 3 views
11

У меня есть очень простую структуру каталогов:CMake исполняемым расположение

Project 
Project/src 
Project/build 

Исходные файлы находятся в Project/src, и я делаю сборку из-из-Src в Project/build. После запуска cmake ../ ; make я могу запустить исполняемый файл таким образом: Project/build$ src/Executable - то есть Executable создан в каталоге build/src.

Как установить местоположение исполняемого файла в файле CMakeLists.txt? Я попытался выполнить некоторые из примеров, найденных в cmake.org, но ссылки, которые работают, похоже, не показывают этого поведения.

Мой Project/src/CMakeLists.txt файл указан здесь.


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

set (SBSProject_SOURCES 
    main.cpp 
    ) 

add_executable(TIOBlobs ${SBSProject_SOURCES}) 

И верхнего уровня Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6) 
project (SBSProject) 

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

add_subdirectory(src) 

ответ

16

У вас есть несколько вариантов.

Чтобы изменить местоположение исполняемых файлов по умолчанию, установите CMAKE_RUNTIME_OUTPUT_DIRECTORY в нужное место. Например, если добавить

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

вашей Project/CMakeLists.txtперед команды add_subdirectory, ваш исполняемый файл будет в конечном итоге в Project/build для Unix строит или build/<config type> для Win32 сборки. Для получения более подробной информации, выполните следующую команду:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY 

Еще один вариант для проекта такого размера, чтобы иметь только один CMakeLists.txt. Вы могли бы более или менее заменить add_subdirectory(src) на содержимое Project/src/CMakeLists.txt для достижения тех же выходных путей.

Однако есть еще несколько проблем.

Возможно, вы вообще не хотите использовать link_directories. Для объяснения, запустите

cmake --help-command link_directories 

Даже если вы используете link_directories, то маловероятно, что какие-либо библиотеки будут найдены в ${SBSProject_BINARY_DIR}/src

Другая проблема заключается в том, что CMAKE_CXX_FLAGS распространяется на Unix сборки, поэтому, вероятно, следует завернуть в блок if (UNIX) ... endif(). Конечно, если вы не планируете строить что-либо, кроме Unix, это не проблема.

Наконец, я рекомендовал бы требовать CMake 2.8 как минимум, если вы не должны использовать 2.6 - CMake является активно разрабатываемым проектом, и текущая версия имеет много существенных улучшений по сравнению с 2,6

Так одна заменой для Project/CMakeLists.txt может выглядеть следующим образом:

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

Другой способ перемещения исполняемого местоположения файла осуществляется через set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)

Смежные вопросы