Я использую cmake для управления своей кроссплатформенной билды, и у меня все получилось кроме этой проблемы. Я установил RUNTIME_OUTPUT_DIRECTORY
в каталог bin/
, в котором хранятся файлы данных. В Linux это работает нормально. В Windows исполняемые файлы помещаются в подкаталог Debug
/Release
в зависимости от типа сборки. Есть ли способ заставить cmake копировать исполняемый файл в нужный каталог или (что еще лучше) вообще прекратить использование этих подкаталогов?
cmake RUNTIME_OUTPUT_DIRECTORY в Windows
Ответы (7)
Я годами использовал способ взлома свойства префикса, о котором сообщил 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}")
Я не уверен, являются ли эти каталоги преднамеренными или ошибкой, но с риском прямой несовместимости вы можете добавить:
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? Я не уверен, какая функциональность изменилась между двумя версиями, но, возможно, стоит попробовать.
Некоторые переменные 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
на одно и то же может сработать.
На данный момент лучший ответ, который я нашел, — просто написать команды установки 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)
Это будет путь к папке, в которой создан ваш проект, поэтому, в зависимости от настроек вашего проекта, это будет либо папка Debug, либо папка Release.