首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动配置C std lib报头相关编译错误的结果

自动配置C std lib报头相关编译错误的结果
EN

Stack Overflow用户
提问于 2017-11-04 03:58:01
回答 2查看 822关注 0票数 3

我正在尝试构建一个带有自动/自动生成系统的项目。这是一个使用良好的项目,因此我对配置脚本、makefile或代码在收到它们时遇到的问题表示怀疑。这可能是某种环境、路径、标志等问题--只要简单地使用正确的参数运行正确的命令就可以了。

配置步骤似乎以令人满意的方式完成。当我运行make时,会向我展示一组错误(主要是以下类型):

代码语言:javascript
复制
error: ‘TRUE’ undeclared here (not in a function)
error: ‘struct work’ has no member named ‘version’
error: expected ‘)’ before ‘PRIu64’

让我们关注最后一个问题,我花了很多时间研究它--我怀疑所有的错误都与缺少的定义有关。显然,没有找到C标准库头文件inttypes.h.h中的易于打印的扩展定义。然而,在配置步骤中,声称所有的事情都是有序的:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
HAVE_INTTYPES_H='1'
#define HAVE_INTTYPES_H 1

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

所讨论的源.c文件中包含了config.h,正如您所期望的,据我通过m4宏机制了解,该文件应该添加一个

代码语言:javascript
复制
#include <inttypes.h>

线路。是的,正如您可能会问的那样,如果我自己在.c文件中输入这一行,它似乎会正常工作,而PRIu64错误就会消失。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-04 06:55:31

autoconf不会自动生成#include指令。您需要在HAVE_*宏的基础上自己完成这一任务。因此,您必须添加这样的内容:

代码语言:javascript
复制
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif

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

票数 3
EN

Stack Overflow用户

发布于 2017-11-04 08:04:59

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

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

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

您可能会发现一些预处理标志对获取更多细节很有用:-dM-dD或其他。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47107222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档