cmake生成器表达式在IDE和命令行中的行为有所不同

时间:2019-05-22 12:05:03

标签: cmake

我正在尝试根据构建配置使用其他目标属性。 有一个导入的目标叫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的。

1 个答案:

答案 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