如何在版本控制中存储C库依赖项?

时间:2010-12-10 06:31:25

标签: c version-control dependencies

来自Rails背景,我习惯于能够在Gemfile中指定我的应用程序的依赖关系,该文件被检入我的git repo。当我的应用程序被拉动时,用户只需运行bundle install并且他们拥有所有必需的依赖项。

this answer中,社区似乎同意不应将C库检入源代码控制。这是有道理的(毕竟Gems本身没有在Rails下签入)但它仍然会产生问题。如果我编写一些代码并在用户创建的库中包含新的依赖项,那么如何在源代码管理中表达这种依赖?

2 个答案:

答案 0 :(得分:3)

显然,C世界中的东西有点不同,因为你在运行时不需要源代码。在GNU / Linux(以及许多其他* ix)系统上完成的一般方法是使用配置脚本或程序执行某些配置步骤。其中最常见的是由GNU configure生成的着名autoconf脚本。 autotools会生成大量缓存文件并将大量辅助脚本复制到源代码树中,所以请记住设置.gitignore或者你会发疯。

许多库在pkg-config$prefix/lib/pkgconfig中为$prefix/share/pkgconfig安装控制文件。这些由pkg-config工具读取,以检查库是否存在,并为该库获取正确的编译器和链接器标志。它们是纯文本,因此请查看/usr/lib/pkgconfig以了解这些内容。

autoconf中,通过调用宏处理器configure.ac(通过名为configure的包装器)将文件m4编译为autoconf。要检查与pkg-config一起使用的库,事情真的很简单。您可以在configure.ac

中添加以下内容
# Checks for libraries.
PKG_CHECK_MODULES([GLib], [glib-2.0])

这将检查是否已安装pkg-config,然后使用它来检查包glib-2.0,并在此过程中打印消息Checking for GLib...。它还会设置shell变量GLib_CFLAGSGLib_LIBS,并安排将它们替换为AC_CONFIG_FILES创建的任何文件(例如Makefile,来自{{1} }})。如果找不到glib,Makefile.in将失败并显示错误。请查看configure以查找/usr/share/aclocal/pkg.m4的定义,该定义支持其他一些选项。文档位于pkg-config(1)手册页中。

如果您的从属库没有PKG_CHECK_MODULES支持,有时库供应商会提供pkg-config宏。例如,旧版本的SDL提供了autoconf,但新版本只使用AM_PATH_SDL

如果没有供应商的支持,有时会在autoconf archive提供第三方支持。 autoconf存档在Debian GNU / Linux和MacPorts(可能还有许多其他系统)中作为一个包提供,这意味着可以使用任何所需的定义而无需手动复制pkg-config个文件。

如果上述情况均不属实,请使用AC_CHECK_HEADER等内容检查标头,并使用AC_CHECK_LIB等内容检查库。

答案 1 :(得分:2)

  

社区似乎同意不应将C库检入源代码控制。

取决于您使用的库。例如,当我使用Sqlite时,我检查我的版本控件上的sqlite文件并使用我的源文件构建它。这很容易,因为sqlite附带一个源文件和一个标头。如果库有更多文件,这将不实用。

  

但它仍然会产生问题。如果我编写一些代码并在用户创建的库中包含新的依赖项,那么如何在源代码管理中表达这种依赖?

在Linux上,这是使用autotools处理的。使用它,您可以指定要使用的包,配置将尝试在构建时找到它。如果您正在寻找跨平台解决方案,CMake是最好的工具。这些工具可以找到安装在标准位置(/usr/lib/usr/include)上的软件包,还提供了一种调整搜索补丁的方法。