29

各种开发人员不鼓励使用PKG_CHECK_MODULES(例如,在这个答案中),但就我所寻找的原因而言,没有明确、全面的解释。所以,我问:

  • 为什么会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 
4

2 回答 2

27

一个重要的问题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_LIBafter PKG_CHECK_MODULES

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

- 编辑 -

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

于 2012-04-19T14:05:04.610 回答
7

这里有一篇博客文章详细介绍了 PKG_CHECK_MODULES 的坏方面:

http://tirania.org/blog/archive/2012/Oct-20.html

或者这个stackoverflow问题:

使用 pkg-config 宏 PKG_CHECK_MODULES 失败

它基本上归结为:如果有人试图运行 autoconf 并且没有安装 pkg-config,它会导致非常无用的错误。这是我今天运行的错误示例autoconf && ./configure

./configure: line 5283: syntax error near unexpected token `FFMPEG,'
./configure: line 5283: `   PKG_CHECK_MODULES(FFMPEG, libavutil libavformat libavcodec libswscale, HAVE_FFMPEG=yes)'

对于只是试图编译一个包的用户/开发人员来说,这不会尖叫“你需要安装 pkg-config”。

如果(如文章所示)您只是直接调用 pkg-config ,您会得到更多有用的错误,例如:

AC_SUBST(MONO_LIBS)
AC_SUBST(MONO_CFLAGS)
if pkg-config --atleast-version=2.10 mono; then
   MONO_CFLAGS=`pkg-config --cflags mono`
   MONO_LIBS=`pkg-config --libs mono`
else
   AC_MSG_ERROR(Get your mono from www.go-mono.com)
fi

编辑:在评论中 Helmut Grohne 说:

请不要直接调用 pkg-config。这样做会破坏交叉编译。使用 AC_PATH_TOOL(PKG_CONFIG,pkg-config) 或更好的 PKG_PROG_PKG_CONFIG 来发现要使用哪个 $PKG_CONFIG。

我认为这是正确的,你应该听从他的建议,但我没有亲自尝试过。

其他人建议根本不使用 pkg-config ;这是一个单独的问题。

于 2016-05-29T09:46:11.613 回答