gcc 编译问题:src/massip-addr.c:299:3: 附注:使用 -std=c99 或 -std=gnu99 来编译您的代码

gcc 编译问题:src/massip-addr.c:299:3: 附注:使用 -std=c99 或 -std=gnu99 来编译您的代码。

源码安装一个扩展时,执行 make 报错如下:

make

fatal: 没有发现名称,无法描述任何东西。
cc -g -ggdb -Wall -O2 -c src/crypto-base64.c -o tmp/crypto-base64.o
cc -g -ggdb -Wall -O2 -c src/crypto-blackrock.c -o tmp/crypto-blackrock.o
cc -g -ggdb -Wall -O2 -c src/crypto-blackrock2.c -o tmp/crypto-blackrock2.o
cc -g -ggdb -Wall -O2 -c src/crypto-lcg.c -o tmp/crypto-lcg.o
cc -g -ggdb -Wall -O2 -c src/crypto-primegen.c -o tmp/crypto-primegen.o
cc -g -ggdb -Wall -O2 -c src/crypto-siphash24.c -o tmp/crypto-siphash24.o
cc -g -ggdb -Wall -O2 -c src/event-timeout.c -o tmp/event-timeout.o
cc -g -ggdb -Wall -O2 -c src/in-binary.c -o tmp/in-binary.o
cc -g -ggdb -Wall -O2 -c src/in-filter.c -o tmp/in-filter.o
cc -g -ggdb -Wall -O2 -c src/in-report.c -o tmp/in-report.o
cc -g -ggdb -Wall -O2 -c src/main-conf.c -o tmp/main-conf.o -DGIT=““unknown””
cc -g -ggdb -Wall -O2 -c src/main-dedup.c -o tmp/main-dedup.o
cc -g -ggdb -Wall -O2 -c src/main-initadapter.c -o tmp/main-initadapter.o
cc -g -ggdb -Wall -O2 -c src/main-listscan.c -o tmp/main-listscan.o
cc -g -ggdb -Wall -O2 -c src/main-ptrace.c -o tmp/main-ptrace.o
cc -g -ggdb -Wall -O2 -c src/main-readrange.c -o tmp/main-readrange.o
cc -g -ggdb -Wall -O2 -c src/main-status.c -o tmp/main-status.o
cc -g -ggdb -Wall -O2 -c src/main-throttle.c -o tmp/main-throttle.o
cc -g -ggdb -Wall -O2 -c src/main.c -o tmp/main.o
cc -g -ggdb -Wall -O2 -c src/masscan-app.c -o tmp/masscan-app.o
cc -g -ggdb -Wall -O2 -c src/massip-addr.c -o tmp/massip-addr.o
src/massip-addr.c: 在函数‘ipv6address_selftest’中:
src/massip-addr.c:292:7: 警告:联合初始值设定项中有多余元素 [默认启用]
{NULL, {{0, 0}, 0}}
^
src/massip-addr.c:292:7: 警告:(在‘tests[8].ip_addr.<匿名>’的初始化附近) [默认启用]
src/massip-addr.c:299:3: 错误:只允许在 C99 模式下使用‘for’循环初始化声明
for (int i = 0; tests[i].name != NULL; i++) {
^
src/massip-addr.c:299:3: 附注:使用 -std=c99 或 -std=gnu99 来编译您的代码
src/massip-addr.c:296:13: 警告:未使用的变量‘ip’ [-Wunused-variable]
ipaddress ip;
^
make: *** [tmp/massip-addr.o] 错误 1


在gcc编译中如果使用

for(int i=0;i<n;++i){}会提示错误

错误:只允许在 C99 模式下使用‘for’循环初始化声明 用gcc编译出现

就是说你的你的c编译器不是c99标准

这是编译器自身的问题了 你可以换编译器
for(int i=0;i<100;i++)

int i;
for(i=0;i<100;i++)
就 i 作用域这一丁点小差别 换一种写法而已 这不是重点
重点是思维 数据结构
学程序没必要在c99这种小节上花功夫
当然也有解决方法,如下
错误处理:

C99 允许在for语句的 “表达式1 ”中定义并初始变量, gcc4 编译c语言的默认标准是C89, 编译C99程序需加参数 “–-std=c99” ;使用

gcc Program12.1.c -o Program12.1 --std=c99就解决了。

下面了解一下

  1. 最初的 ANSI C 标准 (X3.159-1989) 在 1989 年被批准,并于 1990 年发布。稍后这个标准被接受为 ISO 标准 (ISO/IEC 9899:1990) 。虽然 ISO 标准将 ANSI 标准的某些章节重新编号并变为条款,但是两者实际上并无区别。不论是 ANSI 标准还是 ISO 标准,通常都称之为 C89 ,偶尔也因为发布日期而被叫做 C90 。 ANSI 标准 ( 非 ISO 标准 ) 同时附带了 rationale 文档。可以使用 -ansi , -std=c89 或 -std=iso9899:1990 选项指定 GCC 使用 C89 标准;可以使用 -pedantic 选项来得到所有的诊断信息( 或者使用 -pedantic-errors 选项以使 wangning 变为 error) 。PS:pedantic adj. 1. 卖弄学问的 2. 学究式的,迂腐的

  2. 新的 ISO C 标准是 1999 年发布的 ISO/IEC 9899:1999 ,通常称之为 C99 。 GCC 目前不完整的支持这个版本。详情请参考 http://gcc.gnu.org/gcc-4.4/c99status.html 。为了指定 GCC 使用这个版本的 C 标准,需要 -std=c99 或 -std=iso9899:1999 选项。

  3. 默认情况下, GCC 提供了一些 C 语言的扩展,极少的几处会与 C 标准冲突。关于这些冲突请参考 “ C 语言家族的扩展 ” 一节。使用上述的 -std 选项将会关闭这些有冲突的扩展。你也可以显式的使用选项 -std=gnu89 ( 对应 C89 的 GNU 扩展 ) 或 -std=gnu99 ( 对应 C99 的 GNU 扩展 ) 来选择对应版本的扩展功能。如果没有给出 C 语言 “ 方言 ” 选项,将默认的使用 -std=gnu89 ;若要使用C99的特性要设置-std=gnu9x。


解决方法:

make CFLAGS=-std=c99

这个时候会提示另一个错误。

这个时候不要执行: make clean,直接执行 make 就好了,然后执行
make install
完毕,成功

CFLAGS 表示用于 C 编译器的选项
-std=c99 表示使用 c99 标准


或者修改 Makefile 中的 CFLAGS 添加 -std=c99,示例如下:

CC = cc
CFLAGS = -std=c99 -g -O2
CFLAGS_CLEAN = $(CFLAGS)
CPP = cc -E
CPPFLAGS = -DHAVE_CONFIG_H
CXX =
CXXFLAGS =

重新make,这个时候之前的报错不见了,又有了新的报错(这不重要),然后又改了点别的(这也不重要)
发现还是那个错误,想着是不是有缓存呀,恍惚记得有个命令是这样的: make clean
然后重新make,这时"意外"居然发生了,第二个错误不见了(所以说它不重要)直接编译通过。然后再执行make install安装成功
后续使用也没有遇到其他问题。
叨叨了这么多,总结一下就是遇到这个问题,这样解决

先执行 make clean 清除缓存

然后重新make && make install 就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码讲故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值