PKG_CHECK_MODULES被认为有害吗?

bra*_*zzi 23 autoconf pkg-config autotools

各种开发人员不鼓励使用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 
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 24

一个重要的问题PKG_CHECK_MODULES是它会导致失败.如果用户安装libfoo/p/a/t/h并调用configure与脚本LDFLAGS=-L/p/a/t/h,用户在期待configury找理由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 不是包管理系统,这是一个应该由包管理工具解决的问题.

  • 关于.pc的一个巧妙之处在于,它为您提供了库所需的CFLAGS,例如-mms-bitfield.此外,静态编译所需的库,冲突的模块和各种运行时的详细信息,例如模块安装的位置等.所以你建议依赖"标准机制"似乎并不包括这些情况.它不仅仅是寻找一个lib和一个符号.虽然我同意在某些情况下添加更多链接时间检查可能会有所帮助,但这也会减慢配置时间.依靠最小化.sys正确性类似于依赖某些缓存结果 (5认同)
  • 所有这些都说回到你提出的标准机制是不可行的,依靠PKG_CONFIG_LIBDIR的正确系统使得我可以毫不费力地为各种系统进行交叉编译. (4认同)
  • 您说“使用 pkg-config 来填充 CFLAGS、CPPFLAGS、LDFLAGS 和 LIBS,而不使用 PKG_CHECK_MODULES”,但您的回答是“我建议图书馆停止分发 .pc 文件”。嗯? (3认同)
  • @elmarco关于"静态编译所需的库",它们非常有用,但我是对的,PKG_CHECK_MODULES不支持静态链接(pkg-config的--static标志)? (2认同)

Jos*_*phH 6

这里有一篇博客文章,详细介绍了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)'
Run Code Online (Sandbox Code Playgroud)

对于只是尝试编译包的用户/开发人员,这不会尖叫"你需要安装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
Run Code Online (Sandbox Code Playgroud)

编辑:在评论Helmut Grohne说:

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

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

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

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