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

标签 c linux makefile autoconf automake

我正在尝试构建一个带有 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 错误消失了。

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

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

最佳答案

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

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

如果这些行出现在 confdefs.h 中,configure 脚本使用的临时头文件,这确实使您的应用程序无法执行这些 #includes。如果 configure 将它们写入 confdefs.h,这只是为了其他 configure 测试的好处,而不是供应用程序使用。

关于c - autoconf configure 导致 C std lib header 相关的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107222/

相关文章:

gcc - 为 gcc 生成依赖项

windows - Eclipse、cmake、Windows、MingW - 什么 Makefile 生成器?

linux - ubuntu 上的内核版本不正确

c++ - Emacs 最快的 C++ 编译过程?

c - 在 64 位平台上取消引用整数指针

c - 在程序中使用几个小函数会影响性能吗?

python - OpenCv - cv2.VideoWriter对象没有属性释放

linux - 捕获到/dev/tty 的直接重定向

在 C 中创建 X-Y 绘图

c - IF 语句参数更新和函数调用