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

Posted

技术标签:

【中文标题】使用 autoconf/automake,如何指定包含文件路径?【英文标题】:With autoconf/automake, how do I specify include file paths? 【发布时间】:2011-11-20 00:59:09 【问题描述】:

假设我想让生成的 makefile 将一些特定的头文件路径传递给 g++。

我需要添加什么到 configure.ac 或 Makefile.am 来指定这个?

(注意 - 我不想使用 ./configure 在 CPPFLAGS 中传递它。我希望在该步骤之前将这些路径烘焙)

编辑: 具体来说,我想包括 /usr/include/freetype 和 /mypath/include。

我放了 AC_CHECK_HEADERS([freetype/config/ftheader.h]) 并且它通过了,但似乎没有将它添加到 -I 传递给 g++。

我也尝试过添加 CPPFLAGS=-I.:/usr/include/freetype:/mypath/include,但它搞砸了,两次输入 -I,第一次是 -I。它忽略了第二个-I。

【问题讨论】:

这看起来是错误的做法。 ./configure 是确定您正在编译的系统上的位置的步骤,因此它也是允许编译用户告诉它标头路径的非默认位置在哪里的步骤。 CPPFLAGS 不是冒号分隔的列表。你想要 CPPFLAGS='-I/usr/include/freetype -I/mypath/include' 【参考方案1】:

在包文件中硬编码路径绝对是错误的做法。如果您选择这样做,那么您需要意识到您违反了使用自动工具构建包的基本规则。如果你在你的包文件中指定/mypath/include,你在一个包中指定了特定于你的机器的东西,该包打算在所有机器上工作;显然这是错误的。看起来你想要的是你的包(在你的机器上构建时)在/mypath 中查找头文件。这很容易实现,而不会破坏您的包裹。 (至少)有 3 种方法可以做到这一点:

    使用 config.site 文件。在/usr/local/share/config.site(必要时创建此文件)中,添加以下行:

    CPPFLAGS="$CPPFLAGS -I/mypath/include"
    

    现在,任何使用 autoconf 生成的配置脚本和默认前缀 (/usr/local) 的包都会将 -I/mypath/include 附加到 CPPFLAGS,并且会找到 /mypath/include 中的标头。

    如果您希望对所有构建进行分配(不仅仅是要安装在/usr/local 中的那些),您可以使用这个:

    将指定CPPFLAGS 的同一行放在$HOME/config.site 中,并在默认shell 环境中设置CONFIG_SITE=$HOME/config.site。现在,每当您运行 autoconf 生成的配置脚本时,都会进行来自 $HOME/config.site 的分配。

    只需在默认 shell 环境中指定 CPPFLAGS

与修改构建文件相比,所有这些解决方案都有两个主要优势。首先,它们将适用于所有 autoconf 生成的包(只要它们遵循规则并且不执行诸如在构建文件中分配用户变量(例如 CPPFLAGS)之类的事情)。其次,它们不会将您的机器特定信息放入应该适用于所有机器的包中。

【讨论】:

听起来不错,但是,... 由 configure 生成的 Makefile 正在生成一个编译语句,它不引用环境 CFLAGS 或 CPPFLAGS env 变量。 如果包是使用automake构建的,默认规则应该有$(CFLAGS)$(CPPFLAGS)在适当的地方。如果没有,包维护者正在严重滥用 automake。也许您正在查看的包使用手写Makefile.in【参考方案2】:

由于问题是关于在 automakefile 中放入什么,我会认为 AM_CPPFLAGS 是用于为所有 C/C++ 编译添加包含和定义的正确变量。见http://www.gnu.org/software/automake/manual/html_node/Program-Variables.html

例子:

AM_CPPFLAGS = -I/usr/local/custom/include/path

【讨论】:

我同意这是对该问题的最直接的实际答案。只需在 Makefile.am 中添加这样的一行,您就可以为构建目标指定自定义包含路径。

以上是关于使用 autoconf/automake,如何指定包含文件路径?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何正确更新 m4、autoconf、automake 和 libtool? Mac OSX

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

autoconf/automake/libtool - 如何取消定义 PACKAGE_NAME、PACKAGE_TARNAME、PACKAGE_VERSION 等

安装 Autoconf, Automake & Libtool