【发布时间】:2013-03-27 09:35:57
【问题描述】:
我有一个包含标题的 C 文件。此标头位于不同的位置,具体取决于构建机器运行的 Linux 发行版。
使用自动工具检测不同位置的标头最干净的方法是什么?
【问题讨论】:
我有一个包含标题的 C 文件。此标头位于不同的位置,具体取决于构建机器运行的 Linux 发行版。
使用自动工具检测不同位置的标头最干净的方法是什么?
【问题讨论】:
使用标准的AC_CHECK_HEADERS 宏。
它将为标题创建正确的预处理器定义。
例如:
AC_CHECK_HEADERS([somepath/foo.h someotherpath/foo.h])
将根据找到的标头创建预处理器定义HAVE_SOMEPATH_FOO_H 或HAVE_SOMEOTHERPATH_FOO_H。如果两个标题都找到,或者两者都找到。使用这些宏来决定要包含哪个标头。
【讨论】:
AC_CHECK_HEADERS([foo.h]),用户适当设置CPPFLAGS或者设置工具链来查找头部。这不是项目维护者的问题,而是用户的问题。
/tmp/foo/include中安装foo.h的用例:维护者无法合理地将/tmp/foo/include/foo.h放入configure.ac!
维护者没有责任担心这些事情。任何合理构建的分发都将被设置,以便预处理器可以在它安装在系统上的任何位置找到头文件(而不是用户的 $HOME 或其他一些非标准位置)。如果将工具链安装在非标准位置,则设置工具链以查找标头是特定于平台的任务,在 Linux 中通过设置CPPFLAGS 最容易完成。例如,用户可能会运行
./configure CPPFLAGS=-I/p/a/t/h
(使用旧版本的 autoconf 生成的配置脚本可能需要调用 CPPFLAGS=-I/p/a/t/h ./configure)或者她可以将 /p/a/t/h 添加到 CPATH,或者使用任何其他可用的方法来通知预处理器在哪里查找包含文件.作为维护者,您需要做的就是确保配置脚本检查用户是否正确设置了工具链,您可以通过在 configure.ac 中包含对 AC_CHECK_HEADERS 的调用来做到这一点:
AC_CHECK_HEADERS([foo.h])
【讨论】: