выходной каталог среды выполнения cmake в Windows

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

7 ответов


Я использую fine prefix property hack сообщил Ogapo в течение многих лет. Это работает.

но начиная с версии CMake 2.8 существует официальная поддержка для предотвращения выпуска / отладки подкаталогов в Windows.

используйте либо global CMAKE_<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION> переменные или per-target <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}")

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

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()

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


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

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? Я не уверен, какая функциональность изменилась между 2, но, возможно, стоит попробовать.


некоторые переменные 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. 

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


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


для меня глобальная:

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

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


необходимо изменить расположение сборки проектов visual studio. Перейдите в свойства проекта и на вкладке компиляция укажите "путь вывода сборки", чтобы быть там, где вы хотите.

Примечание

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

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

$(TargetPath)

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