PKG_CHECK_MODULES被认为有害吗?

时间:2012-04-19 02:41:40

标签: 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 

2 个答案:

答案 0 :(得分:23)

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文件解决的问题可以更好地解决。自动工具是一个包管理系统,这是一个应该由包管理工具解决的问题。

答案 1 :(得分:6)

这里有一篇博文,详细介绍了PKG_CHECK_MODULES的坏处:

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

或此stackoverflow问题:

Using the pkg-config macro PKG_CHECK_MODULES failing

它基本上归结为:如果有人试图运行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;这是一个单独的问题。