cmake RUNTIME_OUTPUT_DIRECTORY в Windows - PullRequest
       75

cmake RUNTIME_OUTPUT_DIRECTORY в Windows

17 голосов
/ 12 февраля 2009

Я использую для управления кроссплатформенными сборками, и у меня все работает, кроме этой проблемы. Я установил RUNTIME_OUTPUT_DIRECTORY в каталог bin/, в котором хранятся файлы данных. В Linux это работает нормально. В Windows исполняемые файлы помещаются в подкаталог Debug / Release в зависимости от типа сборки. Есть ли способ заставить скопировать исполняемый файл в соответствующий каталог или (что еще лучше) вообще прекратить использование этих подкаталогов?

Ответы [ 7 ]

14 голосов
/ 15 августа 2014

Я использовал хак с префиксом свойств, о котором сообщал Ogapo в течение многих лет. Это работает.

Но в CMake версии 2.8 существует официальная поддержка, позволяющая избежать подкаталогов Release / Debug в Windows.

Используйте либо глобальные CMAKE_<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION> переменные, либо свойства для каждой цели <ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>, например:

SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
11 голосов
/ 16 июня 2009

Я не уверен, являются ли эти каталоги преднамеренными или ошибочными, но есть риск несовместимости в будущем:

if (MSVC_IDE)
    # hack to get around the "Debug" and "Release" directories cmake tries to add on Windows
    set_target_properties (${NAME} PROPERTIES PREFIX "../")
endif()

это работает для меня

2 голосов
/ 17 февраля 2009

Я нашел несколько хороших обсуждений на эту тему:

http://www.cmake.org/pipermail/cmake/2008-April/021355.html

http://www.vtk.org/Bug/bug_view_advanced_page.php?bug_id=8366

Можно ли использовать устаревший EXECUTABLE_OUTPUT_PATH вместо RUNTIME_OUTPUT_DIRECTORY ? Я не уверен, какие функциональные возможности изменились между двумя, но, возможно, стоит попробовать.

1 голос
/ 09 сентября 2011

Для меня глобальный:

set(CMAKE_STATIC_LIBRARY_PREFIX "../lib")
set(CMAKE_SHARED_LIBRARY_PREFIX "../lib")

сделал работу, поэтому мне не нужно устанавливать ее для каждой библиотеки (CMake 2.8.4)

1 голос
/ 21 сентября 2009

На данный момент лучший ответ, который я нашел, - это просто написать CMake команды установки для каждой из моих целей и файлов данных и настроить отладчик MSVC для работы из каталога установки. Это дает дополнительное преимущество использования CPack для создания установщиков.

1 голос
/ 22 февраля 2009

Некоторые переменные cmake имеют определенные версии сборки.

CMAKE_C_FLAGS 
    the compiler flags for compiling C sources. Note you can also specify switches with ADD_DEFINITIONS(). 
CMAKE_C_FLAGS_DEBUG 
    compiler flags for compiling a debug build from C sources. 
CMAKE_C_FLAGS_RELEASE 
    compiler flags for compiling a release build from C sources. 
CMAKE_C_FLAGS_RELWITHDEBINFO 
    compiler flags for compiling a release build with debug flags from C sources. 

Я не проверял, существуют ли эти переменные, но, возможно, настройка RUNTIME_OUTPUT_DIRECTORY_DEBUG && RUNTIME_OUTPUT_DIRECTORY_RELEASE на то же самое может работать.

0 голосов
/ 20 февраля 2009

Вам нужно изменить место сборки ваших проектов визуальной студии. Перейдите в «Свойства проекта» и на вкладке «Компиляция» укажите «Путь вывода сборки», чтобы быть там, где вы хотите.

Примечание

Не знаю, насколько это актуально, поскольку я не знаю о CMake.

Вы можете использовать следующий токен в событиях сборки Visual Studio:

$(TargetPath)

Это будет путь к папке, в которую построен ваш проект, поэтому в зависимости от настроек проекта это может быть папка Debug или Release.

...