【问题标题】:Including third-party libraries in C applications在 C 应用程序中包含第三方库
【发布时间】:2011-05-25 13:03:09
【问题描述】:

在使用 C 语言进行应用程序开发时,我有点天真。我一直在为我正在研究的编程语言编写大量代码,我想包含来自 ICU 的东西(用于国际化和 unicode 支持)。

问题是,我只是不确定是否有任何包含第三方库的约定。对于像 readline 这样的东西,很多系统可能已经安装了它,链接到它是安全的(我认为)。但是如果我想在我自己的代码中包含一个版本的库呢?这很常见还是我认为这一切都错了?

【问题讨论】:

    标签: c organization


    【解决方案1】:

    如果您的代码需要第三方库,则需要在构建之前检查它们。在 Linux 上,至少在开源的情况下,执行此操作的规范方法是使用 Autotools 编写一个配置脚本,该脚本查找库的存在以及如何使用它们。值得庆幸的是,这是非常自动化的,并且有大量示例。基本上你写了一个configure.ac(和/或Makefile.am),它们分别是autoconfautomake的源文件。它们被转换为configureMakefile.in./configure 使用您指定的任何配置时选项有条件地构建 Makefile。

    请注意,这实际上仅适用于 Linux。我想在 Windows 上执行此操作的规范方法是使用 IDE 的项目文件...

    【讨论】:

      【解决方案2】:

      如果它是一个 .lib 并且它没有运行时链接库,它会被编译到您的代码中。如果您需要链接到动态库,您必须确保它们在那里提供安装程序或将用户指向他们可以获得它们的位置。

      【讨论】:

        【解决方案3】:

        如果您正在谈论将您的软件交付给最终用户并且担心依赖关系 - 您必须向他们提供正确的软件包/安装程序,其中包括运行您的软件所需的依赖关系,或者确保用户可以获得它们(受当地法律、出口法律等的约束,但这些都是关于许可的)。

        您可以在 ICU 和您使用的任何其他东西中构建您的软件和静态链接,或者您可以发布您的软件和 ICU 共享库。

        【讨论】:

          【解决方案4】:

          这取决于您的目标操作系统。对于 Linux 和 Unix 系统,您通常会看到动态链接,因此应用程序将使用系统上已安装的库。如果你这样做,这意味着如果他们还没有这个库,则由用户来获取它。如果您以发行版的包格式打包您的应用程序,Linux 中的包管理器将为您执行此操作。

          在 Windows 上,您通常会看到静态链接,这意味着应用程序会捆绑库并且它将使用该特定版本。许多不同的应用程序可能使用相同的库,但包含它们自己的版本。因此,您可以在您的系统上浮动许多库副本。

          【讨论】:

            【解决方案5】:

            将库副本与您的代码一起提供的问题在于,您无法从库维护者的免费错误修复中受益。晦涩、小型和不受支持的库通常值得静态链接。否则,我只需添加依赖项并确保您发送的任何包都正确指示它。

            【讨论】:

            • 问题通常是关于什么是模糊、小和不受支持的问题。像 Debian 和 Ubuntu 这样的强包管理系统的用户可能会考虑大量的库标准和“支持”或“维护”,如果有人为其分发维护包,即使它基本上在上游没有维护或可移植性差上游且难以安装。如果您引入对此类库的依赖项,那么更晦涩或 DIY 类型系统的用户肯定会因此而讨厌您...
            • @R:好点。成为 Debian 用户很好,我的 BSD boxen 通常不需要运行花哨的东西,但他们确实称其为依赖地狱是有原因的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            • 2017-04-17
            • 1970-01-01
            • 2018-01-21
            • 2019-08-05
            • 2016-12-21
            相关资源
            最近更新 更多