【问题标题】:Autotools conditional includeAutotools 有条件的包括
【发布时间】:2013-03-27 09:35:57
【问题描述】:

我有一个包含标题的 C 文件。此标头位于不同的位置,具体取决于构建机器运行的 Linux 发行版。

使用自动工具检测不同位置的标头最干净的方法是什么?

【问题讨论】:

    标签: c++ c makefile autotools


    【解决方案1】:

    使用标准的AC_CHECK_HEADERS 宏。

    它将为标题创建正确的预处理器定义。

    例如:

    AC_CHECK_HEADERS([somepath/foo.h someotherpath/foo.h])
    

    将根据找到的标头创建预处理器定义HAVE_SOMEPATH_FOO_HHAVE_SOMEOTHERPATH_FOO_H。如果两个标题都找到,或者两者都找到。使用这些宏来决定要包含哪个标头。

    【讨论】:

    • 不!项目的维护者(编写 configure.ac 的人)不应该检查不同的路径!正确的用法就是AC_CHECK_HEADERS([foo.h]),用户适当设置CPPFLAGS或者设置工具链来查找头部。这不是项目维护者的问题,而是用户的问题。
    • 考虑用户在/tmp/foo/include中安装foo.h的用例:维护者无法合理地将/tmp/foo/include/foo.h放入configure.ac!
    【解决方案2】:

    维护者没有责任担心这些事情。任何合理构建的分发都将被设置,以便预处理器可以在它安装在系统上的任何位置找到头文件(而不是用户的 $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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2017-08-27
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2012-08-07
      • 2015-08-08
      相关资源
      最近更新 更多