c++ - CMake 构建后步骤 : copy multiple files dependent on visual studio configuration

标签 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}")
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) 替换为 ReleaseDebug,上面截取的代码就可以工作。但是,我想根据发布或调试构建模式从相应目录中获取库。在上面截取的代码中,$(ConfigurationName) 没有被 visual studio 构建模式取代。我猜这是因为这是一个 VS2010 变量,在 cmake 生成时未知)。

有人知道如何解决这个问题吗?

最佳答案

ADD_CUSTOM_COMMAND理解生成器表达式,所以你可以使用 $<CONFIG>而不是 $(Configuration)$(ConfigurationName)那里。对于 FILE命令,但是,这是行不通的。但更重要的是,如果这些 DLL 是作为同一项目的一部分构建的,那么文件通配方法将不会在您第一次构建项目时起作用,因为当您第一次在这样的环境中运行 CMake 时,没有任何 DLL 会存在安排。

您可能需要查看 BundleUtilities作为解决问题的更可靠方法。尽管名称如此,但它支持所有平台,而不仅仅是 Mac。您需要调用 fixup_bundle命令作为构建后或安装步骤以实现您所描述的内容。网上已经描述了这种方法的一些变体(例如 herehere )。 您还可以查看 DeployQt4.cmake 的来源应包含在 Modules 中的文件您的 CMake 安装子目录的想法。

关于c++ - CMake 构建后步骤 : copy multiple files dependent on visual studio configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465878/

相关文章:

c++ - 访问 OpenCV Mat CV_16UC1 的元素

c++ - 在 C/C++ 中将十六进制数组作为字符串写入文件

java - 使用 Java 从 Chrome 接收 native 消息

Windows - 嗅探应用程序的文件访问

c# - 如何在c#中加密和解密pdf文件?

visual-studio-2010 - 续订 ClickOnce 证书失败,即使它针对 .NET 4.0 Framework

c++ - 将可变参数模板列表中的整数值分配给静态常量 std::array 成员

c++ - 基础数据类型计划

windows - Delphi 中的跨应用程序拖放

.net - 如何创建库项目