Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake生成后步骤:根据visual studio配置复制多个文件_C++_Windows_Visual Studio 2010_Cmake - Fatal编程技术网

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。

这不就是
$(配置)
而不是
$(配置名称)