Я пытаюсь использовать другое целевое свойство в зависимости от конфигурации сборки.Импортированная цель называется libmongocxx и имеет 3 свойства для разных конфигов:
IMPORTED_LOCATION_DEBUG
IMPORTED_LOCATION_RELEASE
IMPORTED_LOCATION_RELWITHDEBINFO
Итак, чтобы скопировать необходимые зависимости для создания каталога, я попытался использовать следующий код:
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_PROPERTY:libmongocxx,$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>"
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
Проблема: это прекрасно работает, когда я запускаю конфигурацию из IDE (я пробовал CLion и VS2017), но тот же CMakeLists.txt
не удается настроить, когда я запускаю cmake из командной строки.Ошибка cmake
показывает:
CMake Error at CMakeLists.txt:93 (add_custom_command):
Error evaluating generator expression:
$<TARGET_PROPERTY:libmongocxx,$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>
$<TARGET_PROPERTY:...> expression requires a non-empty property name.
Кстати, я уже обнаружил, что эту же задачу легче решить с помощью выражения генератора TARGET_FILE
, но все же, почему различается поведение в IDE ииз командной строки?Я обнаружил это в CMake версии 3.12.3, но позже проверил на 3.14.4 (только для строки cmd), и он все еще не работает.
Обновление
Вот минимальный примервоспроизвести проблему.Никаких зависимостей не требуется.test.cpp - пустой файлКонфигурация успешно завершается из VS2017, но не выполняется из строки cmd.
CMakeLists.txt:
project(test LANGUAGES CXX)
cmake_minimum_required(VERSION 3.8.0)
add_executable(${PROJECT_NAME} test.cpp)
set_target_properties(${PROJECT_NAME} PROPERTIES
IMPORTED_LOCATION_DEBUG "libd.dll"
IMPORTED_LOCATION_RELEASE "lib.dll"
IMPORTED_LOCATION_RELWITHDEBINFO "libi.dll"
)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_PROPERTY:${PROJECT_NAME},$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>"
$<TARGET_FILE_DIR:${PROJECT_NAME}>
)
Командная строка:
cmake -G "Visual Studio 15 2017 Win64" ..
Update2
Не могу согласиться с тем, что этот вопрос является дубликатом.Другой вопрос касается правильной настройки сборки Visual Studio.Этот вопрос касается использования выражений генератора cmake и использования cmake из командной строки.