autoconf configure 导致 C std lib header 相关的编译错误

autoconf configure results in C std lib header related compile errors

我正在尝试构建一个带有 automake/autoconf 构建系统的项目。这是一个经常使用的项目,所以我怀疑我收到的配置脚本、makefile 或代码有问题。这可能是某种环境、路径、标志等问题 - 在我这边只是 运行 使用正确的参数使用正确的命令。

配置步骤似乎以令人满意的方式完成。当我 运行 make 时,我看到了一组主要是这些类型的错误:

error: ‘TRUE’ undeclared here (not in a function)
error: ‘struct work’ has no member named ‘version’
error: expected ‘)’ before ‘PRIu64’

让我们关注最后一个问题,我已经花时间研究它 - 我怀疑所有错误都与缺少定义有关。显然,未找到来自 C 标准库头文件 inttypes.h 的打印友好扩展定义。然而,在配置步骤中,一切都声称是有序的:

configure:4930: checking for inttypes.h
configure:4930: /usr/bin/x86_64-linux-gnu-gcc -c -g -O2  conftest.c >&5
configure:4930: $? = 0
configure:4930: result: yes

如果我查看 confdefs.h、config.h、config.log 输出变量等,所有 INTTYPES 标志都已正确设置:

HAVE_INTTYPES_H='1'
#define HAVE_INTTYPES_H 1

无论是进行本机构建还是交叉编译(对于 arm-linux-gnueabihf,又名 armhf),问题都是一样的。

有问题的源 .c 文件确实包含了 config.h,正如您所期望的那样,根据我通过 m4 宏机制的理解,应该添加一个

#include <inttypes.h>

行。是的,正如您可能会问的那样,如果我自己将这一行输入到 .c 文件中,它似乎可以工作并且 PRIu64 错误消失了。

我想知道如何调试此类问题 - 基本上,我所知道的一切都告诉我我已正确完成配置,但我留下了一个虚假的 make进程。除了尝试我能找到的每一个 ./configure 调整和技巧之外,我已经开始研究自动生成的 Makefile.in 本身,但到目前为止还没有。也在研究如何让 C 预处理器告诉我它实际插入了哪些头文件。

编辑:我已经通过配置、config.log、Makefile 等确认 -DHAVE_CONFIG_H 机制看起来不错

autoconf 不会自动生成 #include 指令。您需要根据 HAVE_* 宏自行执行此操作。所以你必须添加这样的东西:

#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif

如果这些行出现在 confdefs.h 中,这是一个由 configure 脚本使用的临时头文件,这确实是您的应用程序执行这些 #include 的借口。如果 configure 将它们写入 confdefs.h,这仅是为了其他 configure 测试的利益,而不是供应用程序使用。

首先,运行 make -n 失败的目标。这可能是一些 .o 文件;您可能需要进行一些调整才能正确获取其路径。

现在您有了用于编译文件的命令。如果您通过思考此命令没有找到问题,请尝试 运行 它,添加 -E 以强制预处理器输出文本而不是调用编译器。

请注意,现在 .o 文件将是文本文件,您必须在没有 -E 的情况下重建它。

您可能会发现一些 preprocessor flags 对获取更多详细信息很有用:-dM-dD 或其他。