各种开发人员不鼓励使用 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/