我在 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 theDEPENDS
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/