我正在尝试构建一个带有自动/自动生成系统的项目。这是一个使用良好的项目,因此我对配置脚本、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.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如果查看condefs.h、config.h、config.log输出变量等,所有INTTYPES标志都将正确设置:
HAVE_INTTYPES_H='1'
#define HAVE_INTTYPES_H 1无论是进行本机构建还是交叉编译(为armhf gnueabihf,又名armhf),问题都是一样的。
所讨论的源.c文件中包含了config.h,正如您所期望的,据我通过m4宏机制了解,该文件应该添加一个
#include <inttypes.h>线路。是的,正如您可能会问的那样,如果我自己在.c文件中输入这一行,它似乎会正常工作,而PRIu64错误就会消失。
我想知道如何调试这类问题--本质上说,我所知道的一切都告诉我我已经正确地完成了配置,但剩下的是一个伪造的make process。除了尝试每一个./配置调整和我能找到的技巧之外,我已经开始研究自动生成的Makefile.in本身,但是到目前为止还没有。另外,我还研究了如何让C预处理器告诉我它实际上正在插入哪些头文件。
编辑:我已经确认,通过配置、config.log、Makefile等,config.log机制看起来不错。
发布于 2017-11-04 06:55:31
autoconf不会自动生成#include指令。您需要在HAVE_*宏的基础上自己完成这一任务。因此,您必须添加这样的内容:
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif如果这些行出现在confdefs.h中,这是configure脚本使用的一个临时头文件,这确实使您的应用程序无法执行这些#include。如果configure将它们写入confdefs.h,这完全是为了其他configure测试的利益,而不是用于应用程序。
发布于 2017-11-04 08:04:59
首先,对失败的目标运行make -n。这可能是一些.o文件;您可能需要进行一些调整才能正确地获得路径。
现在您有了用于编译文件的命令。如果您没有通过思考这个命令来发现问题,那么尝试运行它,添加-E来强制预处理器输出文本,而不是调用编译器。
注意,现在.o文件将是文本,以后您必须在不使用-E的情况下重新构建它。
您可能会发现一些预处理标志对获取更多细节很有用:-dM或-dD或其他。
https://stackoverflow.com/questions/47107222
复制相似问题