lib和带有autoconf的模块之间有什么区别



为了编译我的库,我必须检查是否存在某些库(libm、libdl)。

在我的config.ac模板文件中,有PKG_CHECK_MODULES宏和PKG_CHECK_LIB宏。

我不知道该用哪一个,怎么用?

PKG_CHECK_MODULES似乎是最全局的,因为它检查是否存在整个库,而PKG_CHECK_LIB只检查是否有一个函数可访问……但当我执行PKG_CHECK_MODULES([LIBM],[libm],[],[exit -1])时,它存在,我不明白为什么。

我想我误解了一些概念。也许有人能帮我找到好的推荐人。

PKG_CHECK_MODULES用于与具有pkg配置元数据的软件包集成。该元数据通常存储在名为foo.pc(用于包foo)的文件中,该文件位于类似/usr/share/pkgconfig的位置。该文件将说明foo及其相关文件(头文件、库、可执行文件、数据等)的实际安装位置。

然而,大多数包都不使用pkg-config系统,包括标准的C库,libmlibdl就是其中之一。因此,您需要使用AC_CHECK_LIB进行测试。

你似乎很困惑,所以我在这里做一点切线:


从前,有X11;X11存在许多不兼容的安装。为了编写针对每种变体进行编译的代码,人们会编写疯狂的autoconf宏,试图自动确定在哪些库之前列出,在哪些库之后列出,以及在两者之间需要哪些额外的标志。(参见AC_PATH_XAC_PATH_XTRA)。

有些人尝试了更明智的方法,并编写了shell脚本来安装库;所以你只需要调用它们,它们就会为你提供特定库所需的所有神奇标志。(参见sdl-configwx-configfreetype-configmotif-config等)

然后,freedesktop.org的人员认为,维护那些基本上做同样事情的脚本对每个人来说都是一件苦差事,所以他们编写了一个工具(pkg配置),它可以像所有*-config脚本一样工作,并且不需要shell来运行(对Windows用户来说是这样)。库作者所需要做的就是在*.pc文件中编写元数据,并将它们与库一起安装。


关于autoconf,它有一些低级的方法可以在系统中四处查找库:AC_CHECK_HEADERS,查看标头是否存在和可用,AC_CHECK_LIB,查看是否可以针对它们进行链接。

pkg配置工具附带了用于autoconf的方便宏,主要是PKG_CHECK_MODULES,它不四处查找,而是简单地查找库可能安装的元数据。


关于libm、libdl,正如ldav1s所说,它们是系统的一部分;一些系统需要针对libm(提供数学函数)和/或libdl(提供动态加载共享对象的函数)的显式链接。通常其他工具,如gcc或libtool,负责针对它们进行链接。不幸的是,它们没有附带用于pkg配置的元数据,因此,如果必须手动查找它们,则必须使用旧的AC_CHECK_HEADERSAC_CHECK_LIB宏才能找到它们。

最新更新