CMake post-build-event:复制已编译的库

Posted

技术标签:

【中文标题】CMake post-build-event:复制已编译的库【英文标题】:CMake post-build-event: copy compiled libraries 【发布时间】:2016-11-19 19:25:05 【问题描述】:

我的项目的二进制目录结构目前是这样的(Windows):

bin/mainProject/Debug,Release
bin/library1/Debug,Release
bin/library2/Debug,Release
...
bin/libraryN/Debug,Release

我想将库library1lib.dll、...libraryNlib.dll 复制到bin/mainProject/Debug,Release 目录中。

对于 CMake,我认为使用构建后事件是可行的,因此我尝试将其添加到每个库的 CMakeLists.txt:

add_custom_command(TARGET library1 POST_BUILD
    COMMAND $CMAKE_COMMAND -E copy
        $CMAKE_CURRENT_BINARY_DIR/$CMAKE_BUILD_TYPE/library1lib.dll
        $CMAKE_BINARY_DIR/mainProject/$CMAKE_BUILD_TYPE/
)

目前有两个问题:

    $CMAKE_BUILD_TYPE 似乎没有定义,至少我在输出窗口中得到了该变量的空字符串。 是否有可能使该构建后事件更通用?喜欢用一些变量替换实际的 dll 名称?

【问题讨论】:

【参考方案1】:

您可以使用generator expressions 使其更通用:

add_custom_command(
    TARGET library1 
    POST_BUILD
    COMMAND $CMAKE_COMMAND -E copy
        $<TARGET_FILE:library1>
        $<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>
)

替代方案

如果每个依赖项都是在 CMake 项目中构建的,您也可以为所有可执行文件和 DLL 提供一个通用输出路径,例如:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$CMAKE_BINARY_DIR/Out")

注意:这里需要绝对路径,否则它会相对于每个目标的默认输出路径。请注意,配置的子目录是由 CMake 自动附加的。

参考文献

How to copy DLL files into the same folder as the executable using CMake?

【讨论】:

在许多情况下,CMAKE_RUNTIME_OUTPUT_DIRECTORY 似乎是合适的解决方案。如果您遵循使用目标属性而不是全局变量的所谓“现代 CMake”方法,则可以在每个目标上设置属性 RUNTIME_OUTPUT_DIRECTORY。

以上是关于CMake post-build-event:复制已编译的库的主要内容,如果未能解决你的问题,请参考以下文章

Cmake 问题。复制 dll 构建后

使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录

如何将参数 -fvisibility=default 添加到 CMAKE? [复制]

如何在CMAKE和CLION中的每次构建后运行复制脚本? [重复]

如何在 CMake 中构建过程后复制目标的所有运行时依赖项?

GTKmm 的 CMake 错误 - 找不到包 'gtkmm-3.0'