autoconf configure导致与C std lib头相关的编译错误
我正在尝试构建一个带有automake/autoconf构建系统的项目。这是一个使用良好的项目,所以我对收到配置脚本、生成文件或代码时出现的问题表示怀疑。这可能是某种环境、路径、标志等方面的问题——在我这方面,只需使用正确的参数运行正确的命令 配置步骤似乎以令人满意的方式完成。当我运行make时,我会看到一组错误,主要有以下类型:autoconf configure导致与C std lib头相关的编译错误,c,linux,makefile,autoconf,automake,C,Linux,Makefile,Autoconf,Automake,我正在尝试构建一个带有automake/autoconf构建系统的项目。这是一个使用良好的项目,所以我对收到配置脚本、生成文件或代码时出现的问题表示怀疑。这可能是某种环境、路径、标志等方面的问题——在我这方面,只需使用正确的参数运行正确的命令 配置步骤似乎以令人满意的方式完成。当我运行make时,我会看到一组错误,主要有以下类型: error: ‘TRUE’ undeclared here (not in a function) error: ‘struct work’ has no membe
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
无论是进行本机构建还是交叉编译(对于ARMLinuxGnueAbihf,又称armhf),问题都是一样的
所讨论的source.c文件确实如您所期望的那样包含了config.h,根据我通过m4宏机制的理解,它应该添加一个
#include <inttypes.h>
#包括
线路。是的,正如您可能会问的那样,如果我自己将这一行输入到.c文件中,它似乎可以工作,PRIu64错误就会消失
我只想知道如何调试这种类型的问题-基本上,我所知道的一切都告诉我我已经正确地完成了配置,但我只剩下一个伪造的make过程。除了尝试我能找到的每一个./configure调整和技巧外,我已经开始查看自动生成的Makefile.in本身,但到目前为止什么都没有。还研究了如何让C预处理器告诉我它实际插入了哪些头文件
编辑:我已经通过configure、CONFIG.log、Makefile等确认了-DHAVE\u CONFIG\H机制看起来不错。autoconf不会自动生成
\include
指令。您需要根据HAVE.*
宏自己执行此操作。因此,您必须添加如下内容:
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#如果定义有_INTTYPES_H
#包括
#恩迪夫
如果这些行出现在
confdefs.h
中,这是configure
脚本使用的临时头文件,则应用程序不必执行这些#include
s。如果configure
将它们写入confdefs.h
,这仅用于其他configure
测试,而不用于应用程序使用。首先,对失败的目标运行make-n
。这可能是一些.o
文件;您可能需要进行一些调整以正确获取其路径
现在您有了用于编译文件的命令。如果仔细考虑这个命令没有发现问题,请尝试运行它,添加-E
以强制预处理器输出文本,而不是调用编译器
请注意,现在.o
文件将是文本文件,以后必须在不使用-E
的情况下重建它
您可能会发现一些有用的信息来获取更多详细信息:-dM或-dD或其他信息。非常好的建议。但是,在配置工作流程中执行此操作有点困难。例如,如果我执行
CFLAGS=“-E.”/configure
,那么我将得到检查C编译器是否工作。。。否
和配置:错误:C编译器无法创建可执行文件
,这是可以理解的,因为编译器在CPP后未被调用。。。但是如何读取CPP输出呢?make-n
输出看起来不错,关键是HAVE\u CONFIG\u H
,如图所示:echo“CC”app.o/usr/bin/x86_64-linux-gnu-gcc-DHAVE_CONFIG_H-I.-lpthread-fno严格别名-I./compat/jansson-2.6/src-I./compat/jansson-2.6/src-I./compat/libusb-1.0/libusb-I./lib-I./lib-g-O2-MT-app.o-MD-MP-MF.deps/app-app.Tpo-c-o-app.o(等)
。。。考虑到手动插入的include可以正常工作,我认为include路径没有任何问题。复制make-n
的输出并将其粘贴到命令行中。如果失败的方式与之前相同,您可以添加-E
来找出HAVE\u CONFIG\u H没有达到预期效果的原因。这真是一个很好的制作知识,我为您鼓掌,先生。事实证明,问题在于,回购协议产生的代码并不像我认为的那样处于良好状态。我对自动工具的无知意味着我看不到显而易见的东西。config.log的premium confdefs.h部分向我展示了这些行,因此我不得不认为这是正确设置的。在输出变量下面,我们有confdefs.h部分显示#define have_INTTYPES_h1
对不起,我不明白confdefs.h
是配置检查使用的临时头。我想我会遵循。我在给定的.c源代码中看到了这些行,例如:#ifdef HAVE#u CURSES#include#endif
,因此它们利用了config.h中的#define HAVE#u CURSES 1
行。对于HAVE_INTTYPES_H,我也会这样做,它不在源文件中。确实有效;考虑到这个软件包的历史和使用情况,我不明白这个关键部分是如何丢失的。我希望我从回购协议中收到的代码能够被构建;现在我发现情况并非如此,因此需要解开一个新的谜团。谢谢你的意见!我这里的问题是假设我收到的代码是正确的,这应该是它的开发历史。原来问题出在代码中,而不是自动工具配置。此外,我从未见过关于#include指令的清晰的autotools文档,因此我相信