gcc编译代码报错及编译方式

一、error: ‘for‘ loop initial declarations are only allowed in C99 mode

前段时间写了一个小C程序,放在linux下用gcc编译出错,弹出以下错误:

百度后才知道,是gcc的模式问题。

我在for循环里习惯直接定义并初始化变量来使用:

for(int i=0;i<length; i++)

而在gcc编译时是错误的,应该在循环外定义变量:

int i;

for(i = 0; i<length; i++)

这样才编译通过。

这是因为gcc基于c89标准,换成C99标准就可以在for循环内定义i变量了。

如果一定要在for循环语句里定义并初始化,可以将文件按照下面的方式编译就会通过了:

gcc src.c -std=c99 -o src

二、gcc编译C文件

常用编译命令选项
假设源程序文件名为test.c。

1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

3. 选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。

4. 选项 -S
用法:#gcc -S test.i 
作用:将预处理输出文件test.i汇编成test.s文件。

5. 选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。

6. 无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。

7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

多源文件的编译方法

如果有多个源文件,基本上有两种编译方法:
假设有两个源文件为a.c和b.c,b.h,在a.c文件里调用b.c的函数

1. 多个文件一起编译
用法:#gcc b.c a.c -o a
作用:将testfun.c和test.c分别编译后链接成test可执行文件。

2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:
#gcc -c b.c //将b.c编译成b.o
#gcc -c a.c //将a.c编译成a.o
#gcc -o b.o a.o -o a //将b.o和a.o链接成a

以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

3. 如果要编译的文件都在同一个目录下,可以用通配符gcc *.c -o 来进行编译。

如果是有成千上万的项目文件,可以把上述的编译过程写进以下一个文本文件中:
Linux下称之为makefile

感谢各位网友的分享,仅作总结学习。

时间: 2024-10-09 02:53:34

gcc编译代码报错及编译方式的相关文章

IntelliJ IDEA 编译代码报错 找不到符号 符号: 找不到符号包 包

在使用IDEA的时候,经常出现过找不到包或者找不到符号的情况,可以尝试以下几种方式来解决 1.如果项目使用的是Maven可以使用Maven-Reimport 2.还可以 Invalidate and Restart (无效并重新启动) 3.统一编码格式 4.重新编译 1.打开Project Structure -->Modules 找到项目编译输出目录 2.将target目录下文件清空 3.右键项目重新build 原文地址:https://www.cnblogs.com/qinxu/p/9139

Xcode6编译SDWebImage报错原因分析(SDWebImageDownloaderOperation.m错误)

之前写了一片关于编译SDWebImage报错解决方法的文章: http://blog.csdn.net/cuibo1123/article/details/39434015 结果很多人问这个问题的原因,那就在这里给大家说一说好了,分析思路一并送上(不过我还是建议大家自己动手去分析). 首先,如果新建工程,按照SDWebImage的方式声明输出口并引用: @interface ZCTest () @property (assign, nonatomic, getter = isExecuting)

安装编译qemu-kvm报错Make sure to have the zlib libs and headers installed.

[[email protected] qemu-kvm.git]# ./configure Error: zlib check failed Make sure to have the zlib libs and headers installed. 解决上面报错需要安装zlib相关的软件 [[email protected] qemu-kvm.git]# yum install zlib* 安装完上面软件后继续出现下面报错 [[email protected] qemu-kvm.git]# .

centos7编译libiconv报错:./stdio.h:1010:1: error: &#39;gets&#39; undeclared here (not in a function)

如题:配置编译参数通过,在进行 make 的时候报如下错误: In file included from progname.c:26:0: ./stdio.h:1010:1: error: 'gets' undeclared here (not in a function) _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); ^ make[2]: *** [progname.o] Error 1

linux Ubuntu14.04 make编译文件报错:No rule to make target `/usr/lib/libpython2.7.so&#39;, needed by `python/_pywraps2.so&#39;. Stop.

错误过程:当“make”编译文件时报错No rule to make target `/usr/lib/libpython2.7.so', needed by `python/_pywraps2.so'.  Stop. 解决过程: 1.首先输入命令以下代码获取其出错原因 make --debug 错误提示如下,很明显是项目工程找不到它,原因有两个,一是系统没有装libpython2.7.os:二是装了,路径错误,或者名字不对 File '/usr/lib/libpython2.7.so' doe

PHP编译安装报错: mcrypt.h not found. Please reinstall libmcrypt.

PHP编译安装报错: mcrypt.h not found. Please reinstall libmcrypt. 转载2016-04-25 12:40:44 标签:linuxitphp 解决方法: 1.为系统安装perl-Geo-IP,默认yum源中没有这个包,特意安装epel第三方yum源[[email protected] ~] rpm -Uvh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rp

centos编译libpng报错,解决方法

/usr/local/lib/libz.a: could not read symbols: Bad value 一般是64 位 电脑才会出现. 解决方法如下: 1 cd zlib-1.2.3 //进入zlib目录 2 3 CFLAGS="-O3 -fPIC" ./configure //使用64位元的方法进行编译 4 5 make 6 7 make install 8 9 make clean centos编译libpng报错,解决方法,布布扣,bubuko.com

VS2013编译protobuf报错:error C4996: &#39;std::_Copy_impl&#39;: Function call with parameters that may be unsafe

今天碰到这个问题,网上找了好久, 解决方法如下 VS2013编译protobuf报错:error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe 方法一 右键点击工程 -> 属性 -> C/C++ -> 常规 -> SDL检查 改为:否 (/sdl-) 编译 O了! 方法二 右键点击工程 -> 属性 -> C/C++ ->预处理器 添加宏定义 _SCL_SECUR

VS2010报错无法编译:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid

win7 64位 专业版 + vs2010 从vc6.0下转过来的一个项目,突然遇到这个问题. 解决方案: 用C:\Windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7600.16385_none_ba476986f05abc65下面的cvtres.exe替换掉C:\Program Files\Microsoft Visual Studio 10.0\VC\bin的cvtres.exe ,就可以了. VS2010