【问题标题】:compile dependencies into a library itself将依赖项编译成库本身
【发布时间】:2021-09-08 06:17:34
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

    标签: c++ dll libraries


    【解决方案1】:

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

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

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


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

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

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

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

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

    【讨论】:

    • 您好,感谢您的回答。在研究这个时,我遇到了 pImpl 成语。这不能解决问题吗?我会在我的代码上放置一个接口,它只使用 c 代码并在我的接口类的私有部分中转发声明我的实现。所以用户不需要在接口头中包含我的依赖项。
    • @Dennis 是的,它可以解决整个问题的一部分,但设计成本很高。无法使用 C++ 功能或在界面中键入是不使用包管理器的巨大权衡。
    • 好的,我会研究一下,看看我是否真的需要界面中的 c++ 功能,或者我们可以使用什么样的包管理器。您介意在您的答案中添加第三个选项“使用 pImpl 成语”,以便我可以将此问题标记为已回答吗?搜索此问题的人可能希望查看所有三个选项,并且 cmets 不像答案那样“可见”。 (我无法编辑你的答案)
    • @Dennis 我已经在我的回答中的一段中提到了 pimpl 我认为
    猜你喜欢
    • 2012-07-16
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多