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 不是包管理系统,这是一个应该由包管理工具解决的问题.
这里有一篇博客文章,详细介绍了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; 这是一个单独的问题.
归档时间: |
|
查看次数: |
16861 次 |
最近记录: |