Расположение исполняемого файла CMake - PullRequest
12 голосов
/ 19 февраля 2012

У меня очень простая структура каталогов:

Project
Project/src
Project/build

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

Как установить местоположение исполняемого файла в файле 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)

Ответы [ 2 ]

19 голосов
/ 19 февраля 2012

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

Чтобы изменить расположение исполняемых файлов по умолчанию, установите 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 голосов
/ 31 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...