cmake RUNTIME_OUTPUT_DIRECTORY в Windows

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


person thekidder    schedule 12.02.2009    source источник
comment
Я предполагаю, что вы используете cmake для создания файлов решений/проектов Visual Studio, верно? Какая версия Visual Studio используется? Какая версия cmake?   -  person Tom Alsberg    schedule 15.02.2009
comment
Да, я использую CMake для создания файлов решения (cmake 2.6, VS 2005)   -  person thekidder    schedule 15.02.2009


Ответы (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}")
person Christopher Bruns    schedule 15.08.2014
comment
Я не искал решения. И наткнулся на этот ответ, и в то же время я нашел эту ссылку: cmake.org/Bug /view.php?id=9163. В этом ответе используется точно такая же техника. Я думаю, что этот ответ является лучшим решением на данный момент. Работает очень хорошо для меня. Спасибо. - person Robert Wang; 21.06.2016

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

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

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

person Ogapo    schedule 16.06.2009
comment
Это отлично работает и для меня. Для файлов .lib используйте SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES IMPORT_PREFIX ../) - person Torleif; 28.08.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 на одно и то же может сработать.

person verbalshadow    schedule 22.02.2009

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

person thekidder    schedule 21.09.2009

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

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

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

person Mathemaster    schedule 09.09.2011

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

Примечание

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

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

$(TargetPath)

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

person Charlie    schedule 20.02.2009