gpt4 book ai didi

autotools - 如何使用自动工具设置包含路径

转载 作者:行者123 更新时间:2023-12-03 19:57:18 26 4
gpt4 key购买 nike

我正在开发一个使用 autoconf 的 C++ 项目。 & automake ,我正在努力正确设置 *CPPFLAGS 中的包含路径.我已经阅读了大约 3 个小时的文件,但我还无法弄清楚。我不是在寻找黑客,而是在寻找正确的方法。这是我的难题。

在我看来,包含路径有 3 个完全不同的来源:

  • 必须与我的包一起安装的外部库,由 configure --with-XXX=<PATH> 配置.
  • 在我的包中,一些源文件使用 #include <file.h>即使 file.h是包的一部分,所以要编译它们,我必须正确设置包含路径。 (注意,不能编辑所有这些文件。)
  • 异想天开(或非)标准指定必须允许用户指定他们自己的(额外)包含路径。也就是说,我不应该设置 CPPFLAGS一点也不。

  • 在我当前的设置中:
  • 类型 1 路径设置在 configure.ac 内通过 AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>") .
  • 类型 2 路径设置在 Makefile.am 内通过 test_CPPFLAGS = -I<path> .
  • 无法设置类型 3。更准确地说,如果用户设置 CPPFLAGS运行前make ,这会覆盖 Type 1 设置,导致编译失败。当然,用户可以尝试使用 CXXFLAGS相反,但那个有不同的用途(请记住,我要求的是正确的方法来做到这一点,而不是黑客)。

  • 我尝试通过使用 AM_CPPFLAGS 设置类型 1 路径来解决此问题。里面 configure.ac . (供引用:如果您设置了 AM_CPPFLAGS 而不是 CPPFLAGS ,但您仍然需要运行一些检查,例如 AC_CHECK_HEADERS ,您需要临时设置 CPPFLAGS 然后将其恢复为检查工作;这是解释 here 。)这释放了 CPPFLAGS对于类型 3 路径,但不幸的是编译失败,因为 Makefile -s 由 configure 生成只会使用 AM_CPPFLAGS如果没有专门的 <target>_CPPFLAGS存在。所以,如果 test_CPPFLAGS存在类型 2 路径,正在编译 test将失败,因为它没有获得 Type 1 路径。

    解决方法是在 Makefile.am 内指定始终使用 AM_CPPFLAGS .但这是“书本”吗?我可以以全局方式执行此操作,还是必须编辑每一个 target_CPPFLAGS ?还有另一种“正确”的解决方案吗?

    最佳答案

    我知道很难从 autotools 手册中得到直接的答案。有几个很好的从头到尾的教程 herehere .

    没有特定于包的标准变量*CPPFLAGS在自动配置中。 configure可以用 CPPFLAGS=... 调用, automake 会添加这个 CPPFLAGS到相关的 makefile 规则 - 搜索 CPPFLAGSMakefile.in文件作为示例。出于这个原因,我建议您不要将此变量用于其他任何事情。

    Makefile.am 中添加标志到AM_CPPFLAGS变量(所有预处理器调用的默认值)或用 target_CPPFLAGS 覆盖各个预处理器标志.在第 3 方库的示例中,最好使用如下名称:FOO_CPPFLAGS保存预处理器选项,例如,

    FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1"
    ...
    AC_SUBST(FOO_CPPFLAGS)

    Makefile.am :
    AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
    # or:
    target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
    top_srcdir变量由 configure 定义- 我用它来说明第二种情况。假设您有 file.h在另一个目录 other ,在顶级目录下。 -I$(top_srcdir)允许您将其包含为 <other/file.h> .或者, -I$(top_srcdir)/other将允许您将其包含为 <file.h> .

    另一个有用的 preset variablesrcdir - 当前目录。 -I$(srcdir)已添加到 AM_CPPFLAGS默认情况下。所以如果 file.h在当前目录中,您可以将其包含在 <file.h> 中甚至 "file.h" .如果 other是一个“兄弟”目录, -I$(srcdir)/..将允许您包含 <other/file.h> , 和 -I$(srcdir)/../other将允许 <file.h> .

    我还要补充一点,一些软件包安装了 pkg-config .pc文件。如果 pkg-config 的安装设置为搜索正确的目录,您可能会找到 PKG_CHECK_MODULES宏非常有用。

    关于autotools - 如何使用自动工具设置包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230827/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com