繁体   English   中英

lib和使用autoconf的模块有什么区别

[英]What is the difference between a lib and an module with autoconf

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

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

我不知道该使用哪个以及如何使用?

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

我想我误解了一些概念。 也许有人可以引导我参考。

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

但是,大多数软件包都不使用pkg-config系统,包括标准C库,即libmlibdl所在的库。 因此,您需要使用AC_CHECK_LIB对其进行AC_CHECK_LIB

您似乎很困惑,所以在这里我要讲一点切线:


从前,有X11; X11的安装不兼容。 为了编写可针对每个变体进行编译的代码,人们会编写疯狂的autoconf宏,以尝试自动找出之前要列出的库,之后要列出的库以及之间需要额外的标志。 (请参阅AC_PATH_XAC_PATH_XTRA )。

有些人尝试了更明智的方法,并编写了一些shell脚本以在这些库中安装; 因此,您只需调用它们,它们就会为您提供该特定库所需的所有魔术标记。 (请参阅sdl-configwx-configfreetype-configmotif-config等)

然后,来自freedesktop.org的人们认为,维护那些执行相同操作的脚本对于每个人来说都是一件繁琐的事情,因此他们编写了一个工具(pkg-config),该工具可以像所有*-config脚本一样工作,并且不需要要运行的外壳程序(适用于Windows用户)。 库作者需要做的就是将元数据写入*.pc文件,然后将它们安装在库中。


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

pkg-config工具带有用于autoconf的便捷宏,主要是PKG_CHECK_MODULES ,它不是在四处寻找,而只是在寻找库可能已安装的元数据。


关于ldav1所说的libm,libdl,它们是系统的一部分。 一些系统需要针对libm(提供数学函数)和/或libdl(提供动态加载共享对象的函数)的显式链接。 通常,其他工具(例如gcc或libtool)会负责与它们链接。 不幸的是,它们没有pkg-config的元数据,因此,如果您必须手动查找它们,则必须使用旧的AC_CHECK_HEADERSAC_CHECK_LIB宏来查找它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM