首页 > 解决方案 > 将依赖项编译成库本身

问题描述

我想向另一个正在构建更大应用程序(进一步称为“目标应用程序”)的开发人员提供我编写的大型库(进一步称为“我的库”)。我的 lib 处于非常实验性的开发阶段,我可能会经常更改依赖项、版本等。每隔一周打电话给目标应用程序的开发人员来更改依赖项对我来说似乎是一个不干净的选择。只交换一个(或几个)包含我所有依赖项的文件会非常好,这让我想到了我的问题:

我是否可以将所有依赖项编译到我正在构建的库中,这样目标应用程序的开发人员就不必包含我的 lib依赖项的头文件、dll 库等?

可执行文件也有类似的情况,其中静态链接的库将被编译成可执行文件。

这个用例是否有类似的可能?我故意说“库”,因为我不在乎它是否会生成 DLL 或静态链接文件。

提前致谢!

标签: c++dlllibraries

解决方案


真正的答案是:使用适当的依赖管理器。

确保您有一个正确的构建系统设置,无论使用要求如何变化,下线项目都不需要更改。再加上一个依赖管理器,你的使用需求如何都无关紧要:用户只会更新库,而工具会处理其余的事情。

CMake 导出的目标非常适合这种用途。适当的包管理器(例如 vcpkg)可以使用自定义存储库完全处理此问题。


现在是无聊和不理想的答案。

您可以做的是在动态库中编译您的库。仅更新 DLL 和标头并询问静态链接库也会更新,因为它们是静态链接到 DLL 中的。

但是,这样做时,您会遇到一些问题:

首先,您很可能还必须提供库头文件,甚至编译定义。这可能会改变图书馆的使用要求。要隐藏所有这些,您可能需要将所有类包装在 pimpl 包装器中。这将阻止您使用许多功能,例如模板或 constexpr。

其次,当您将库作为 DLL 发布时,您将自己暴露给 ABI。用户尝试仅更新 DLL 而无需重新编译,并且会出现任何 ABI 兼容性问题。添加虚函数、更改函数名称、向类添加成员、更改函数的含义或结果,甚至修复错误都可能导致 ABI 中断。


推荐阅读