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 将 Qt DLL 复制到 Windows 上的可执行目录
如何将参数 -fvisibility=default 添加到 CMAKE? [复制]
如何在CMAKE和CLION中的每次构建后运行复制脚本? [重复]