Cmake 问题。复制 dll 构建后

Posted

技术标签:

【中文标题】Cmake 问题。复制 dll 构建后【英文标题】:Cmake issue. Copying dll post build 【发布时间】:2021-05-28 17:52:36 【问题描述】:

我又在 cmake 上苦苦挣扎。 我想要实现的是: 我有一个项目,比如 ProjectA,它包含一个带有 CMakeLists.txt 的子模块,比如 ProjectB。 ProjectA 将 ProjectB 添加为子目录。 ProjectB 输出一个共享库 (.dll)。

ProjectA 有一个构建后脚本,可将 dll 复制到其输出目录中以便使用它。 问题是,当我在 ProjectB 中更改一些东西时,这个会被构建,但由于在 ProjectA 中没有进行任何修改,它不会构建或复制 dll。

解决方案是将后期构建脚本移动到 ProjectB 中,但如果我这样做,我的子模块将在其他场景中不兼容并与 ProjectA 实现相关联(我的意思是 projectB 的 Cmakelists 文件应该将 dll 复制到目录之外的文件夹,这是我想避免的)。

我真的找不到避免每次手动重建整个项目的方法。

为了让情况更清楚,项目层次结构类似于

项目A/ CMakeLists.txt src/ 供应商/ 项目B/ CMakeLists.txt src/

第一个 CMakeLists.txt 将项目 B 添加为子目录。 此 cmakelists 文件还将构建后脚本应用于项目 A 中的目标,该脚本复制 ProjectB/bin (dll) 的内容。

【问题讨论】:

我想知道您是否在构建后脚本中缺少 DEPENDS 开关。 @user3389943: "post-build" 脚本可能是添加了add_custom_command(TARGET.. POST_BUILD) 的脚本。该命令流没有 DEPENDS 参数。 如果不查看包含 CMake 脚本的最小示例,我们将无能为力。 如果这两个项目在同一个工作区/同一个根 CMakeLists.txt 中,您可能希望避免复制 dll,而是让它们都使用相同的输出文件夹。这就是我为带有 dll 的项目所做的。 构建后的脚本会如何让项目与其他场景不兼容?不,您需要将 dll 复制到同一项目中的多个位置吗?如果不是简单地添加一个缓存变量,允许(可选)定义一个目录来复制 dll 就可以了。 【参考方案1】:

我自己设法解决了这个问题。 对于那些有同样问题并想找到一个好的解决方案的人,不要使用后期构建脚本。 相反,您可以向add_subdirectory 添加第二个参数,指定子项目的构建文件夹。

【讨论】:

以上是关于Cmake 问题。复制 dll 构建后的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2017 中使用 Cmake 构建 ssh.dll

cmake 把中间文件放到某个目录下

使用 cmake 和 msvc 2010 构建 gdcm 2.4.1 无法获取所有 dll

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

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

DLL 不会在构建后事件中复制