我正在尝试编写一个 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)
没有被 visual studio 构建模式取代。我猜这是因为这是一个 VS2010 变量,在 cmake 生成时未知)。
有人知道如何解决这个问题吗?
最佳答案
ADD_CUSTOM_COMMAND
理解生成器表达式,所以你可以使用 $<CONFIG>
而不是 $(Configuration)
或 $(ConfigurationName)
那里。对于 FILE
命令,但是,这是行不通的。但更重要的是,如果这些 DLL 是作为同一项目的一部分构建的,那么文件通配方法将不会在您第一次构建项目时起作用,因为当您第一次在这样的环境中运行 CMake 时,没有任何 DLL 会存在安排。
您可能需要查看 BundleUtilities作为解决问题的更可靠方法。尽管名称如此,但它支持所有平台,而不仅仅是 Mac。您需要调用 fixup_bundle
命令作为构建后或安装步骤以实现您所描述的内容。网上已经描述了这种方法的一些变体(例如 here 和 here )。
您还可以查看 DeployQt4.cmake
的来源应包含在 Modules
中的文件您的 CMake 安装子目录的想法。
关于c++ - CMake 构建后步骤 : copy multiple files dependent on visual studio configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465878/