Я пытаюсь создать простой CMake, который извлекает библиотеки DLL Qt и копирует их в каталог, в котором cmake создает мой исполняемый файл.
Он отлично работает с использованием g ++ или clang, но MSVC (Visual Studio 2017) создает каталог Отлаживать или Релиз.
Я не могу найти способ получить путь к реальному каталогу, в котором записан исполняемый файл (${CMAKE_CURRENT_BINARY_DIR}
возвращает родительский каталог Релиз или Отлаживать).
Я видел людей, использующих целевое свойство RUNTIME_OUTPUT_DIRECTORY
, но когда я его использую, оно пустое.
Есть идеи, как я могу это сделать? Я не хочу менять выходной каталог, я просто хочу знать его путь (поэтому я не хочу менять значение RUNTIME_OUTPUT_DIRECTORY
)
Спасибо!
В Visual Studio на этапе конфигурация (когда файлы CMakeLists.txt
обрабатываются) тип сборки - это не задано, поэтому никакая зависимая от тип сборки переменная или свойство не может использоваться напрямую. Вместо этого следует использовать генератор-выражения.
Например, выходной каталог для исполняемого файла или целевой библиотеки может быть извлечен с помощью выражения генератора $<TARGET_FILE_DIR:tgt>
. Он вернет полный каталог с уже добавленными «Release /» или «Debug /».
Обратите внимание, что выражения генератора могут использоваться только тогда, когда их использование разрешено в документации явно. Например, их нельзя использовать в команде message()
.
В качестве альтернативы вы можете явно установить переменную CMAKE_RUNTIME_OUTPUT_DIRECTORY, чтобы для каждого типа сборки просто добавлял к ней соответствующий подкаталог. Но для извлечения этого подкаталога вам снова следует прибегнуть к выражениям генератора: $<CONFIG>
.
Технически можно установить один и тот же выходной каталог для любого типа сборки. Но это не рекомендуется, потому что файл из одного типа сборки будет перезаписанный файлом из другого типа сборки.