如何在 CMake for Visual Studio 中获取当前配置(发布/调试)

问题描述 投票:0回答:2

我使用的是 Visual Studio 2013、CMake 3.5.1、Windows 10。我尝试通过 CMake 复制一些文件,如下所示:

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/Release)

是否可以用代表配置的变量替换“Release”,例如:

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${Variable})

我尝试过

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})

但是当我使用 message 打印出来时 CMAKE_BUILD_TYPE 是一个空字符串,我也尝试过

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>)

但由于某种原因,文件命令无法解密

$<CONFIGURATION>
而像

这样的命令
add_custom_target(run COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>/Test.exe)

可以。提取 Visual Studio 当前是在 Release 中构建还是在 CMake 中调试中构建的正确方法是什么?

c++ visual-studio visual-studio-2010 visual-studio-2012 cmake
2个回答
20
投票

file
命令在CMake运行时执行,而不是在构建时(即VS运行时)执行。

这也意味着无法使用生成器表达式(例如

$<CONFIG>
),因为它们是在构建时评估的。
提示:只要 CMake 文档中没有明确引用特定命令的生成器表达式的使用,该命令就不支持它们)。

之所以

${CMAKE_BUILD_TYPE}
为空,是因为您可能没有在调用 CMake 时指定它:

cmake -DCMAKE_BUILD_TYPE=Debug ..

但是,使用它意味着仅为 Debug 配置生成构建文件。这显然不是你想要的。

解决您的问题:使用生成器表达式是正确的方法,正如您已经通过使用

add_custom_target
(或
add_custom_command
)找到的那样。

您可以使用自定义命令作为其他“real”目标的依赖项,并且可以通过

add_custom_command
为特定目标指定后/预构建和预链接命令。

正如文档中对于

COMMAND
add_custom_command
参数所述:

COMMAND
的参数可以使用生成器表达式。生成器表达式中对目标名称的引用意味着目标级别的依赖关系,但不是文件级别的依赖关系。使用
DEPENDS
选项列出目标名称以添加文件级依赖项。

成功构建目标后复制文件:

add_custom_command(TARGET myTarget POST_BUILD
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE1}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE2}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
)

0
投票

您可以使用

$(Configuration)
,因为 VS 构建系统在构建期间可以理解它。

© www.soinside.com 2019 - 2024. All rights reserved.