我使用的是 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 中调试中构建的正确方法是什么?
file
命令在CMake运行时执行,而不是在构建时(即VS运行时)执行。
这也意味着无法使用生成器表达式(例如
$<CONFIG>
),因为它们是在构建时评估的。之所以
${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>/"
)
您可以使用
$(Configuration)
,因为 VS 构建系统在构建期间可以理解它。