CMAKE - изменение макроса outdir через cmake

Читая здесь другие вопросы, я обнаружил, что можно изменить макрос outdir внутри de visual studio. Я действительно искал, но не нашел / не понял, как это сделать.

Это довольно просто. Я просто хочу изменить свойство проекта -> Свойства конфигурации -> Общие -> Выходной каталог. Потому что я знаю, что это изменит макрос outdir.

Я понимаю, что это set_target_property с использованием некоторого свойства cmake PROPERTY, но я действительно не нашел, как.

2 ответа

Решение

В конце концов, для меня сработало размещение полного пути к target_link_libraries с префиксом отладки и оптимизированным префиксом для указания конфигурации выпуска и relwithdebinfo config для указания пути выпуска и отладки для отладки. Я также снял link_directories... Я не знаю, если не понял, но у меня это сработало!

Это довольно просто, как вы и подозревали. Вам нужно посмотреть на ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY, а также RUNTIME_OUTPUT_DIRECTORY целевые свойства для изменения пути outdir.

Все они также имеют специфичные для конфигурации варианты (например, ARCHIVE_OUTPUT_DIRECTORY_DEBUG) и могут быть инициализированы глобальными переменными CMake с тем же именем CMAKE_ предваряется.

Таким образом, вы можете сделать, например,

set_target_properties(MyExe PROPERTIES RUNTIME_OUTPUT_DIRECTORY <custom path>)

или, чтобы повлиять на все цели,

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY <custom path>)

NB. Из документов:

Мультиконфигурационные генераторы (VS, Xcode) добавляют подкаталог для каждой конфигурации к указанному каталогу.

Вот пример, показывающий это поведение. Он записывает свои собственные тривиальные исходные файлы C++, поэтому все, что вам нужно сделать, это скопировать это в папку, вызвать CMake, а затем попытаться создать результирующее решение в Debug, Release, MinSizeRel и RelWithDebInfo. Протестировано с VS2012. Исполняемый файл всегда заканчивается <build dir>/Exes/Debug независимо от типа сборки, и аналогично библиотека всегда находится в <build dir>/Libs/Debug,

cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
project(Example)

file(WRITE lib.hpp "void Print();\n")
file(WRITE lib.cpp "#include<iostream>\nvoid Print() { std::cout << \"Hello World\\n\"; }\n")
file(WRITE main.cpp "#include \"lib.hpp\"\nint main() { Print(); return 0; }\n")

set(ArchiveOutputDir ${CMAKE_BINARY_DIR}/Libs/Debug)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${ArchiveOutputDir})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${ArchiveOutputDir})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${ArchiveOutputDir})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${ArchiveOutputDir})

set(RuntimeOutputDir ${CMAKE_BINARY_DIR}/Exes/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${RuntimeOutputDir})

add_library(MyLib lib.cpp lib.hpp)
add_executable(MyExe main.cpp)
target_link_libraries(MyExe MyLib)
Другие вопросы по тегам