繁体   English   中英

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

[英]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错误消失了。

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

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

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

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

如果这些行显示在confdefs.hconfigure脚本使用的临时头文件)中,这confdefs.h您的应用程序执行这些#include 如果configure将它们写入confdefs.h ,这仅仅是为了其他configure测试的好处,而不是为了应用程序使用。

首先,为失败的目标运行make -n 这可能是一些.o文件; 你可能需要一些调整来正确地获得它的路径。

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

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

您可能会发现一些预处理程序标志可用于获取更多详细信息: -dM-dD或其他。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM