可移植地在 autoconf/automake 中包含 GLib 标头

Posted

技术标签:

【中文标题】可移植地在 autoconf/automake 中包含 GLib 标头【英文标题】:Portably include GLib headers in autoconf/automake 【发布时间】:2010-12-16 12:16:40 【问题描述】:

我需要为使用基于 autoconf 的系统构建的项目包含 GLib 标头以实现可移植性。

如何以可移植的方式安全地导入 GLib 标头?我知道pkg-config,但这并不是完全可移植的(因为有些系统没有它,我宁愿只依靠 autoconf 进行配置)。

【问题讨论】:

哪些系统没有pkg-config? “没有”我的意思是默认情况下没有很好的支持(即Windows) 无论如何,如果可能的话,我宁愿只使用自动工具。如有必要,我可以求助于 pkg-config。 默认情况下没有系统有它。在 Windows 中,您可以使用原生的 gtk.org/download-windows.html 或 cygwin 的。 如果你想使用自动工具,你必须检查一些知名文件夹中的 glib 头文件和库,然后为你找到的内容设置变量。 【参考方案1】:

通过使用PKG_CHECK_MODULES 宏,Autoconf 生成的configure 脚本可以自动检索 pkg-config 数据。例如,将此行添加到您的 configure.ac 文件中:

PKG_CHECK_MODULES([DEPS], [glib-2.0 >= 2.24.1])

将导致生成的configure 脚本确保安装的glib-2.0 版本大于或等于2.24.1 版本,并将pkg-config --cflags glib-2.0 的输出附加到变量DEPS_CFLAGSDEPS_LIBSpkg-config --libs glib-2.0,分别。然后在_CFLAGS_LDADD 初选中使用$(DEPS_CFLAGS)$(DEPS_LIBS) 变量:

bin_PROGRAMS = hello

hello_CFLAGS = $(DEPS_CFLAGS)
hello_SOURCES = hello.c
hello_LDADD = $(DEPS_LIBS)

【讨论】:

Makefile.am 中应该是hello_LDADD 而不是hello_LIBS @ecerulm:我认为hello_LDADD 是在您的项目使用libtool 时使用的。 不,应该是hello_LIBADDhello_LIBS 不存在。 *_LIBS 未在 automake doc 中提及。我试过hello_LIBS 对执行的gcc 命令没有任何影响。它被完全忽略,而hello_LDADD 具有在gcc 命令行末尾添加$(DEPS_LIBS) 的预期效果。 @ecerulm:啊!你说的对。我会更正我的答案。【参考方案2】:

GLib 2.22 INSTALL 文件指出 pkg-config 是安装此库的要求。我不是 GLib(双关语!);此要求的声明是INSTALL 文件顶部的第一件事。

从周围的文字中不清楚是否需要pkg-config 来编译 GLib 本身,但很明显 GLib 2.22 作者不打算让任何用户在没有 pkg​​-config 的情况下针对 GLib 进行编译。特别是 GLib 的 make install 会正确安装 .pc 文件。

为了平台可移植性,请指导用户适当设置$PKG_CONFIG_PATH

【讨论】:

以上是关于可移植地在 autoconf/automake 中包含 GLib 标头的主要内容,如果未能解决你的问题,请参考以下文章

安装 Autoconf, Automake & Libtool

autoconf/automake:基于库存在的条件编译?

使用 autoconf/automake,如何指定包含文件路径?

如何通过 autoconf/automake 排除 boost 库/头文件包含问题?

autoconf,automake,libtool

C++学习(三四四)./configuremakemake install,autoconf automake