【问题标题】:What is the difference between a lib and an module with autoconflib和带有autoconf的模块有什么区别
【发布时间】:2014-01-08 14:54:53
【问题描述】:

我必须检查某些库(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_LIB这样的东西。

标签: c++ c shared-libraries autoconf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你似乎很困惑,所以我在这里稍微切线:


    曾几何时,有 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_LIB,查看是否可以链接反对他们。

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


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

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2011-04-10
      • 2013-01-11
      • 2023-03-28
      • 2015-11-25
      • 2011-02-13
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多