Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
autoconf configure导致与C std lib头相关的编译错误_C_Linux_Makefile_Autoconf_Automake - Fatal编程技术网

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

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

我正在尝试构建一个带有automake/autoconf构建系统的项目。这是一个使用良好的项目,所以我对收到配置脚本、生成文件或代码时出现的问题表示怀疑。这可能是某种环境、路径、标志等方面的问题——在我这方面,只需使用正确的参数运行正确的命令

配置步骤似乎以令人满意的方式完成。当我运行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
无论是进行本机构建还是交叉编译(对于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文档,因此我相信