C++ CMake:如何根据配置和体系结构复制不同的文件以构建目录

C++ CMake:如何根据配置和体系结构复制不同的文件以构建目录,c++,visual-c++,cmake,post-build-event,post-build,C++,Visual C++,Cmake,Post Build Event,Post Build,我正在使用为MSVC生成我的vcxproj和sln文件。我想将构建目录中的一些dll复制为POST\u build事件,这些事件根据我是在构建Debug还是Release配置以及是x86还是x64体系结构而有所不同。我使用add\u custom\u命令的方式如下 add_custom_command(TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILES_TO_CO

我正在使用为
MSVC
生成我的
vcxproj
sln
文件。我想将构建目录中的一些
dll
复制为
POST\u build
事件,这些事件根据我是在构建
Debug
还是
Release
配置以及是
x86
还是
x64
体系结构而有所不同。我使用
add\u custom\u命令
的方式如下

add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
    ${FILES_TO_COPY} ${CMAKE_CURRENT_BINARY_DIR})
我想根据架构和配置将
文件设置为不同的值,或者根据相同的条件使用不同的
添加自定义命令。但是CMake MSVC是多配置生成器,并且
CMake_BUILD_TYPE
下面是空的,我不能简单地编写如下内容:

if (CMAKE_SIZEOF_VOID_P EQUAL 4)
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")

    set (FILES_TO_COPY
      "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Debug/i386/libdb52d.dll")

  elseif (CMAKE_BUILD_TYPE STREQUAL "Release")

    set (FILES_TO_COPY
      "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Release/i386/libdb52.dll")

  else ()
    message (FATAL_ERROR "Invalid configuration name ${CMAKE_BUILD_TYPE}.")
  endif ()
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")

    set (FILES_TO_COPY
      "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Debug/x64/libdb52d.dll")

  elseif (CMAKE_BUILD_TYPE STREQUAL "Release")

    set (FILES_TO_COPY
      "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Release/x64/libdb52.dll")

  else ()
    message (FATAL_ERROR "Invalid configuration name ${CMAKE_BUILD_TYPE}.")
  endif ()
else ()
  message (FATAL_ERROR "Unsupported architecture with ${CMAKE_SIZEOF_VOID_P}
    bytes pointer size.")
endif ()
如何正确执行此操作?

尝试以下操作:

set(arch "i386")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(arch "x64")
endif()

set(FILES_TO_COPY "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/$<CONFIG>/${arch}/libdb52$<$<CONFIG:Debug>:d>.dll")
set(拱门“i386”)
如果(CMAKE_SIZEOF_VOID_P等于8)
套装(拱形“x64”)
endif()
设置(要复制的文件“${CMAKE\u SOURCE\u DIR}/Externals/DLLs/bdb/$/${arch}/libdb52$.dll”)

如果您在使用--help或--version调用时研究了编译器的输出,那会有帮助吗?@Richard Hodges我不知道如何研究来自CMake的编译器的输出,以及如何使用来自CMake的
--help
--version
调用它。执行\u进程(命令${CMake\u CXX\u compiler}--版本/帮助?输出\变量编译器\输出)或similar@RichardHodges输出包含架构类型,我也可以通过
CMAKE_SIZEOF_VOID_P
确定,但它不能包含真正的问题
Debug
Release
。啊,我明白了。下面使用生成器表达式的答案解决了这个问题,对吗?+1 10x这在这种情况下有效,但我不能接受这个答案,因为文件路径不需要包含
Debug
Release
i386
x64
。对于我必须添加的其他一些文件,路径中的模式可能会有所不同。@bobeff:对于一般情况,您可以使用
$
模式。有关生成器表达式,请参阅文档:。@Tsyvarev我认为这就完成了答案,我接受了。