我正在尝试根据构建配置使用其他目标属性。 有一个导入的目标叫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)时,这很好用,但是当我从命令行运行cmake时,同一CMakeLists.txt
无法配置。
错误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的。
答案 0 :(得分:2)
Visual Studio IDE CMake插件仅使用RelWithDebInfo和Debug配置(至少对我而言)。通过命令行调用时,默认值为所有四个标准配置:Debug;Release;MinSizeRel;RelWithDebInfo
。
您的CMakeLists.txt不完整,因为未定义或未使用MinSizeRel
,因此没有MinSizeRel
配置的信息。
BTW,CMAKE_BUILD_TYPE
被多配置生成器忽略。 CMAKE_CONFIGURATION_TYPES
定义了在生成过程中应考虑的构建类型。
因此,添加缺少的值或更改CMAKE_CONFIGURATION_TYPES
。