autotools - PKG_CHECK_MODULES 被认为是有害的?

标签 autotools autoconf pkg-config

各种开发人员不鼓励使用 PKG_CHECK_MODULES (例如,在 this answer 中)但就我所寻找的而言,没有对其原因的清晰、全面的解释。所以,我问:

  • 为什么会PKG_CHECK_MODULES有害吗?
  • 有哪些替代方案?

  • 我,其中之一,今天第一次使用它。我发现它非常有用,特别是对于处理非常复杂的库集,例如 GTK+,我有所有这些依赖项:
    -I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0
    -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
    -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
    -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 
    -I/usr/include/freetype2 -I/usr/include/libpng12
    
    -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 
    -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0
    -lgthread-2.0 -lrt -lglib-2.0 
    

    最佳答案

    PKG_CHECK_MODULES 的一个重大问题是它导致了不应该发生的故障。如果用户安装 libfoo/p/a/t/h并调用 configure脚本与 LDFLAGS=-L/p/a/t/h ,用户有理由期待配置找到 libfoo .但是,用户还必须设置 PKG_CONFIG_PATH使configure脚本可以找到foo.pc为了使配置成功,在我看来这是坏的。可以调用 AC_CHECK_LIB然后只调用 PKG_CHECK_MODULES如果没有通过标准机制找到该库,则可以避免该问题。另一个问题是 PKG_CHECK_MODULES 完全有可能找一个 .pc文件中的信息不准确,导致构建失败。在这种情况下,有必要调用 AC_CHECK_LIB之后 PKG_CHECK_MODULES .

    总之,使用PKG_CHECK_MODULES正确,有必要调用 AC_CHECK_LIBS首先,然后有条件地调用 PKG_CHECK_MODULES ,然后调用 AC_CHECK_LIBS再次验证 PKG_CHECK_MODULES 找到的信息.维护者的所有这些额外工作只是为了让用户更容易在非标准位置安装他们的库是荒谬的。用户应该设置他们的工具链以通过标准机制查找库。

    - 编辑 -

    澄清一下,我并不是建议使用鼓励使用 PKG_CHECK_MODULES 的库的包。应该避免在他们的配置中使用它。相反,我建议图书馆不要鼓励使用它并停止分发 .pc文件。 .pc试图解决的问题文件最好在更高级别处理。 autotools 不是包管理系统,这是一个包管理工具应该解决的问题。

    关于autotools - PKG_CHECK_MODULES 被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220946/

    相关文章:

    static-linking - 如何使用pkg-config静态链接库

    ubuntu - cunit pkg-config 配置中缺少版本

    autotools - 检查框架示例在运行 './configure' 时给我错误

    ubuntu - 在 Ubuntu 中很难将数学和 GSL 联系起来

    version - 是否有 autoconf 宏的版本索引,以便我知道要放入 AC_PREREQ 中的版本?

    build - X-I。 : command not found, 构建某种软件失败,怎么回事?

    c++ - Qmake 创建 .pc 文件

    c++ - 交叉编译程序找不到 SDL2 header

    makefile - 有没有一种典型的方法可以使用 autotools 禁用联机帮助页生成?

    c++ - 为什么 autoconf 没有正确检测到 boost ?