首页 > 解决方案 > 在超级构建中共享程序插件的正确方法是什么?

问题描述

以项目的以下示例结构为例:

.
+-- CMakeLists.txt
+-- app1
|   +-- CMakeLists.txt
+-- app2
|   +-- CMakeLists.txt
+-- app3
|   +-- CMakeLists.txt
+-- plugins
|   +-- plugin1
|       +-- CMakeLists.txt
|   +-- plugin2
|       +-- CMakeLists.txt
|   +-- plugin3
|       +-- CMakeLists.txt
+-- tests
|   +-- CMakeLists.txt

现在所有的 appX 和测试都需要 plugins 下的所有插件。(在 Windows 上:包括插件所需的 dll 到可执行目录中)。请注意,我无法修改源代码以适应构建系统。

我天真的方法是在构建步骤之后将每个插件复制到每个应用程序目录中。但这感觉如此难以维护并且“不是正确的方法”。

这些操作是否有一些内置支持?

标签: c++cmake

解决方案


我现在编写了一个脚本,它利用了在构建和安装时运行的https://cmake.org/cmake/help/latest/module/BundleUtilities.html 。所有配置为构建的插件都被添加到一个列表中,该列表将用于将所需的 dll 复制到可执行目录中。fixup_bundle(all_executables all_plugins additional_dirs)

在构建时这会变得更加复杂,因为每个可执行文件都有自己的目录。所以需要一个循环fixup_bundle(current_executable all_plugins additional_dirs)。然而,这需要大量的处理能力和时间来解决所有问题。(如文档中所述),因此只有在开发人员需要时才会运行它。

这不是最好的解决方案,但由于可以将功能捆绑到脚本中,因此它是可维护的,并且大部分功能直接来自 cmake 本身。

一旦 PR 被合并,我将发布脚本的链接(以便可以使用永久链接)


推荐阅读