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)