在C应用程序中包括第三方库

在C应用程序中包括第三方库,c,organization,C,Organization,对于C语言的应用程序开发,我有点幼稚。我一直在为我正在开发的编程语言编写大量代码,我想包括来自ICU的内容(用于国际化和unicode支持) 问题是,我只是不确定是否有任何包含第三方库的约定。对于像readline这样的系统,很多系统可能已经安装了它,只需链接到它就安全了(我认为)。但是,如果我想在自己的代码中包含一个版本的库呢?这是常见的还是我的想法完全错了?如果它是一个.lib,并且没有运行时链接库,那么它会被编译到您的代码中。如果您需要链接到动态库,您必须确保它们在那里,并提供安装程序或向

对于C语言的应用程序开发,我有点幼稚。我一直在为我正在开发的编程语言编写大量代码,我想包括来自ICU的内容(用于国际化和unicode支持)


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

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

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


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

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


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

如果您的代码需要第三方库,您需要在构建之前检查它们。在Linux上,至少在开源的情况下,实现这一点的标准方法是使用Autotools编写一个配置脚本,以查找库的存在以及如何使用它们。谢天谢地,这是相当自动化的,并且有大量的例子。基本上,您可以编写一个
configure.ac
(和/或
Makefile.am
),它们分别是
autoconf
automake
的源文件。它们被转换为
configure
Makefile。在
中,和
/configure
使用指定的任何配置时间选项有条件地构建Makefile


请注意,这实际上只适用于Linux。我想在Windows上实现这一点的标准方法是使用IDE的项目文件…

将库的副本与代码一起提供的问题是,您无法免费获得库维护人员的错误修复的好处。晦涩、小且不受支持的库通常值得静态链接。否则,我只需添加依赖项,并确保您提供的任何软件包都能适当地指示它。

问题通常是,对于什么构成模糊、小和不受支持的内容存在分歧。像Debian和Ubuntu这样的强包管理系统的用户可能会考虑大量的库标准,如果有人维护包用于分发,即使它基本上未被上游维护,或者上游的可移植性差,并且难以安装,也可能支持“支持”或“保持”。如果你引入了对这些库的依赖,那么更晦涩或DIY类型系统的用户肯定会因此而讨厌你…@R:说得对。作为Debian用户很好,我的BSD boxen通常不需要运行花哨的东西,但他们称之为依赖地狱是有原因的。