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

标签 c++ visual-studio visual-studio-2010 visual-studio-2012 cmake

我在 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})

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

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 中调试的正确方法是什么?

最佳答案

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

这也意味着,不能使用生成器表达式(例如 $<CONFIG>),因为它们是在构建时计算的。
(提示:只要在 CMake 文档中没有明确提及对特定命令使用生成器表达式,该命令就不支持它们)。

原因,为什么${CMAKE_BUILD_TYPE}是空的,是由于您可能没有在调用 CMake 时指定它的原因:

cmake -DCMAKE_BUILD_TYPE=Debug ..

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

解决您的问题:使用生成器表达式是正确的方法,因为您已经通过使用 add_custom_target 了解到这一点。 (或 add_custom_command )。

您可以使用自定义命令作为其他“真实”目标的依赖项,您可以通过 add_custom_command 为特定目标指定构建后/预构建和预链接命令。 .

正如 COMMAND 的文件所述add_custom_command 的参数:

Arguments to COMMAND may use generator expressions. References to target names in generator expressions imply target-level dependencies, but NOT file-level dependencies. List target names with the DEPENDS option to add file-level dependencies.

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

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>/"
)

关于c++ - 如何在 Visual Studio 的 CMake 中获取当前配置(发布/调试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39282430/

相关文章:

c++ - 如何尽早离开 OBJ-C 的世界并在 iOS OpenGL ES 应用程序中进入现有的 C++ 代码库?

c++ - <algorithm> 中的 Visual Studio 2008 错误? includes 算法似乎无意中交换了第 3795 行迭代器的顺序

c++ - 使用 GCC 查找无法访问的函数 ("dead code")

c# - Resharper (2016.1 C#) 可以建议用 try catch block 捕获异常吗?

c++ - 如何为这个 C++ Windows 项目创建 "make.bat"?

c++ - float 变量如何存储不在其范围内的负值?

c# - 是否有一个 IDE 可以突出显示结构语法?

visual-studio - 将 ffmpeg/avcodec 与 Visual Studio 2015 链接时无法解析的外部符号?

c# - 为什么 Collections 的评估顺序与使用条件运算符的其他类型不同

c - 循环回到用户输入验证 C