autoconfconfiguration结果在C std lib头相关的编译错误

我正在尝试构build一个automake / autoconf构build系统的项目。 这是一个很好用的项目,所以我对configuration脚本,makefile或代码的问题持怀疑态度。 这可能是某种环境,path,标志等问题 – 在我的最后,只需使用正确的参数运行正确的命令即可。

configuration步骤似乎以令人满意的方式完成。 当我运行make时,我显示了一组主要是这些types的错误:

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

让我们把重点放在最后一个,我花了时间研究 – 我怀疑所有的错误都与缺less的定义有关。 显然,从C标准库头文件inttypes.h中找不到打印友好的扩展定义。 但是,在configuration步骤中声称所有东西都是按顺序排列的:

 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 

所有的INTTYPES标志设置正确,如果我看在confdefs.h,config.h,config.log输出variables等:

 HAVE_INTTYPES_H='1' #define HAVE_INTTYPES_H 1 

无论是做一个本地构build还是交叉编译(对于arm-linux-gnueabihf,又名armhf),问题都是一样的。

有问题的源文件.c文件有你想象中的config.h,根据我的理解,通过m4macros机制应该添加

 #include <inttypes.h> 

线。 是的,正如你可能会倾向于问,如果我自己input这个行到.c文件它似乎工作和PRIu64错误消失。

我还想知道如何debugging这种types的问题 – 实质上,我知道的一切都告诉我,我已经正确地完成了configuration,但是我只剩下一个伪造的过程 。 除了尝试每个./configure调整和技巧,我可以find,我已经开始看自动生成的Makefile.in本身,但没有到目前为止。 同时考虑如何让C预处理器告诉我它实际插入了哪些头文件。

编辑:我已经证实,通过configuration,config.log,Makefile等-DHAVE_CONFIG_H机制看起来不错。

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

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

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

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

现在你有用来编译你的文件的命令。 如果通过冥想此命令没有发现问题,请尝试运行它,添加-E强制执行预处理器输出文本,而不是调用编译器。

请注意,现在.o文件将是文本,并且您必须稍后重新-E

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