将依赖项编译成库本身
compile dependencies into a library itself
我想向另一个正在构建更大应用程序(进一步称为“目标应用程序”)的开发人员提供我编写的大型库(进一步称为“我的库”)。我的库处于非常实验性的开发阶段,我可能会经常更改依赖项、这些库的版本等。每隔一周打电话给目标应用程序的开发人员以更改依赖项对我来说似乎是一个不干净的选择。如果只交换包含我所有依赖项的 单个 (或几个)文件,那就太好了,这让我想到了我的问题:
我是否可以将我所有的依赖项编译到我正在构建的库中,这样目标应用程序的开发人员就不必包含头文件、dll 库等。 my lib?
的依赖项
可执行文件也有类似的情况,静态链接库将被编译成可执行文件。
这个用例是否可能有类似的东西?我故意说“库”是因为我不关心它是否会生成 DLL 或静态链接文件。
提前致谢!
真正的答案是:使用合适的依赖管理器。
确保您拥有正确的构建系统设置,无论使用要求如何变化,项目都不需要进行任何更改。加上依赖管理器,无论您的使用要求如何:用户只需更新库,工具会处理其余部分。
CMake 导出的目标非常适合这种用途。合适的包管理器(例如 vcpkg)可以使用自定义存储库完全处理此问题。
现在是无聊且不理想的答案。
你可以做的是在动态库中编译你的库。仅更新 DLL 和 headers 并询问静态链接库也会更新,因为它们是静态链接到 DLL 中的。
但是,这样做时,您会遇到一些问题:
首先,您很可能还必须运送库 headers,甚至编译定义。这可能会改变您图书馆的使用要求。要隐藏所有这些,您可能需要将所有 classes 包装在 pimpl 包装器中。这将阻止您使用许多功能,例如模板或 constexpr。
其次,当您将库作为 DLL 发布时,您就将自己暴露在了 ABI 之下。用户 将 尝试仅更新 DLL 而无需重新编译,任何 ABI 兼容性问题都会出现。添加虚函数、更改函数名称、向 class 添加成员、更改函数的含义或结果,甚至修复错误都可能导致 ABI 中断。
我想向另一个正在构建更大应用程序(进一步称为“目标应用程序”)的开发人员提供我编写的大型库(进一步称为“我的库”)。我的库处于非常实验性的开发阶段,我可能会经常更改依赖项、这些库的版本等。每隔一周打电话给目标应用程序的开发人员以更改依赖项对我来说似乎是一个不干净的选择。如果只交换包含我所有依赖项的 单个 (或几个)文件,那就太好了,这让我想到了我的问题:
我是否可以将我所有的依赖项编译到我正在构建的库中,这样目标应用程序的开发人员就不必包含头文件、dll 库等。 my lib?
的依赖项可执行文件也有类似的情况,静态链接库将被编译成可执行文件。
这个用例是否可能有类似的东西?我故意说“库”是因为我不关心它是否会生成 DLL 或静态链接文件。
提前致谢!
真正的答案是:使用合适的依赖管理器。
确保您拥有正确的构建系统设置,无论使用要求如何变化,项目都不需要进行任何更改。加上依赖管理器,无论您的使用要求如何:用户只需更新库,工具会处理其余部分。
CMake 导出的目标非常适合这种用途。合适的包管理器(例如 vcpkg)可以使用自定义存储库完全处理此问题。
现在是无聊且不理想的答案。
你可以做的是在动态库中编译你的库。仅更新 DLL 和 headers 并询问静态链接库也会更新,因为它们是静态链接到 DLL 中的。
但是,这样做时,您会遇到一些问题:
首先,您很可能还必须运送库 headers,甚至编译定义。这可能会改变您图书馆的使用要求。要隐藏所有这些,您可能需要将所有 classes 包装在 pimpl 包装器中。这将阻止您使用许多功能,例如模板或 constexpr。
其次,当您将库作为 DLL 发布时,您就将自己暴露在了 ABI 之下。用户 将 尝试仅更新 DLL 而无需重新编译,任何 ABI 兼容性问题都会出现。添加虚函数、更改函数名称、向 class 添加成员、更改函数的含义或结果,甚至修复错误都可能导致 ABI 中断。