C++ CMake生成后步骤:根据visual studio配置复制多个文件
我正在尝试编写一个C++ CMake生成后步骤:根据visual studio配置复制多个文件,c++,windows,visual-studio-2010,cmake,C++,Windows,Visual Studio 2010,Cmake,我正在尝试编写一个CMakeLists.txt,它作为生成后所需的dll事件从外部库复制到生成后可执行文件所在的文件夹中。我正在使用的操作系统是Win7和VS2010 有很多外部库,所以我不想在CMakeLists.txt中单独列出它们。我当前的解决方案是使用文件全局绑定,并为每个库创建生成后事件: FILE(GLOB files "${LIBRARY_DIR}/lib/$(ConfigurationName)/*dll") MESSAGE("FILE LIST IS: ${files}") F
CMakeLists.txt
,它作为生成后所需的dll
事件从外部库复制到生成后可执行文件所在的文件夹中。我正在使用的操作系统是Win7和VS2010
有很多外部库,所以我不想在CMakeLists.txt
中单独列出它们。我当前的解决方案是使用文件全局绑定,并为每个库创建生成后事件:
FILE(GLOB files "${LIBRARY_DIR}/lib/$(ConfigurationName)/*dll")
MESSAGE("FILE LIST IS: ${files}")
FOREACH(file ${files})
ADD_CUSTOM_COMMAND(
TARGET mylib
POST_BUILD
COMMENT "Copying dll ${file}..."
COMMAND ${CMAKE_COMMAND} -E copy ${file} "${CMAKE_BINARY_DIR}/$(ConfigurationName)/"
)
ENDFOREACH()
基本上,如果我将$(ConfigurationName)
替换为Release
或Debug
,则上面截取的代码可以工作。但是,我希望根据发布或调试构建模式从相应的目录获取库。在上面截取的代码中,$(ConfigurationName)
不会被VisualStudio构建模式取代。我猜这是因为这是一个VS2010变量,在cmake生成时未知)
有人知道如何解决这个问题吗?
ADD\u CUSTOM\u命令
理解生成器表达式,因此您可以使用$
而不是$(配置)
或$(配置名称)
。但是,对于文件
命令,这将不起作用。但是,更重要的是,如果这些DLL是作为同一个项目的一部分构建的,那么在您第一次构建项目时,文件全局绑定方法不会起作用,因为在您第一次以这种方式运行CMake时,没有任何DLL
你可能想寻找一种更有效的方法来解决你的问题。尽管它的名字,但它支持所有平台,而不仅仅是Mac。您需要调用fixup\u bundle
命令作为后期构建或安装步骤,以实现您所描述的功能。在线上已经介绍了该方法的一些变体(例如和)。
您还可以查看
DeployQt4.cmake
文件的源代码,该文件应包含在cmake安装的Modules
子目录中,以获取想法。假设您的\u TARGET\u NAME
中填入了项目名称,和ADDITIONAL\u DLL\u PATH
以及包含外部DLL的文件夹列表,则以下代码将复制在windows上使用dumpbin
找到的任何外部依赖项
foreach(配置类型${CMAKE\u配置类型})
字符串(TOUPPER${CONF_TYPE}CONF_TYPE_)
get_属性(目标位置${CONF_类型{U}目标${{TARGET_NAME}属性位置${CONF_类型})
获取\U文件名\U组件(目标目录${TARGET\U位置${CONF\U类型{U}}路径)
安装(代码“
如果(\“\${BUILD\u TYPE}\\”STREQUAL\“${CONF\u TYPE}\”)
包括(捆绑设备)
修复包(\“${TARGET\U LOCATION\U${CONF\U TYPE\U}}}\”\“\”\“${ADDITIONAL\U DLL\U PATH}\”)
endif()
组件(运行时)
endforeach()
不过,此解决方案也有一些缺点,比如需要在需要复制这些文件时构建INSTALL
target(可能不会很多次),并且不检测延迟加载的DLL。这不就是$(配置)
而不是$(配置名称)
?