gcc的基本使用

1. gcc
-o 输出文件名
-O-O1-O2-O3//编译优化
-g-g1-g2-g3//产生调试信息
-Wallerror//-Wall 显示所有警告-Werror 将警告当成错误提示
-w//关闭所有警告
-c//只编译不连接,产生 .o文件(目标文件)
-E//预编译
-S//汇编。 产生 .s文件(汇编文件)
 
编译过程是 -E-c-S自动调用连接器
连接器ld
 
-D//在命令行定义宏 (宏可以在代码中定义,也可以在命令行上定义)
-x//指定编译的语言类型 C, C++, .S(汇编), none(自动判定)
-std=c89
-std=c99
 
----------------------------------------gcc基本使用的小结----------------------------------------------

1、对于警告信息的处理

-w   关闭所有警告
-Wall 显示所有警告
-Werror  把所有警告都当成错误输出

main.c
#include <stdio.h>

int main(){
   int a = NULL;//用于产生警告信息
   return 0;
}

各个选项产生的结果:
1、[fedora@localhost day02_r2]$ gcc main1.c -omain1
main1.c: In function ‘main’:
main1.c:4:12: warning: initialization makes integer from pointer without a cast [enabled by default]

2、[fedora@localhost day02_r2]$ gcc main1.c -omain -w
因为这条命令关闭了所有的警告信息,所以没有输出

3、[fedora@localhost day02_r2]$ gcc main1.c -omain -Werror
main1.c: In function ‘main’:
main1.c:4:12: error: initialization makes integer from pointer without a cast [-Werror]
cc1: all warnings being treated as errors


2、编译优化
-O 
-O0
-O1
-O2
-O3



例子:
[fedora@localhost day02_r2]$ gcc main1.c -o main 
[fedora@localhost day02_r2]$ gcc main1.c -o main1 -O
[fedora@localhost day02_r2]$ gcc main1.c -o main2 -O1
[fedora@localhost day02_r2]$ gcc main1.c -o main3 -O2
[fedora@localhost day02_r2]$ gcc main1.c -o main4 -O3

ls -l  //产生的结果是:
-rwxrwxr-x. 1 fedora fedora 4675 Feb  5 19:07 main
-rwxrwxr-x. 1 fedora fedora 4647 Feb  5 19:08 main1
-rwxrwxr-x. 1 fedora fedora 4647 Feb  5 19:08 main2
-rwxrwxr-x. 1 fedora fedora 4647 Feb  5 19:08 main3
-rwxrwxr-x. 1 fedora fedora 4647 Feb  5 19:08 main4


以下是一些转载的关于gcc -O选项的一些看法(一下看法转载自http://hi.baidu.com/317264476/item/7aba3f9438df6935336eeb1a)
这个选项控制所有的优化等级。使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候。
-O设置一共有五种:-O0、-O1、-O2、-O3和-Os。你只能在/etc/make.conf里面设置其中的一种。
除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc手册的优化选项章节,以便了解每个-O等级启用了哪些选项及它们有何作用。
让我们来逐一考察各个优化等级:
-O0:这个等级(字母“O”后面跟个零)关闭所有优化选项,也是CFLAGS或CXXFLAGS中没有设置-O等级时的默认等级。这样就不会优化代码,这通常不是我们想要的。
-O1:这是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成。
-O2:-O1的进阶。这是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间。
-O3:这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的。
-Os:这个等级用来优化代码尺寸。其中启用了-O2中不会增加磁盘空间占用的代码生成选项。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的。
正如前面所提到的,-O2是推荐的优化等级。如果编译软件出现错误,请先检查是否启用了-O3。再试试把CFLAGS和CXXFLAGS倒回到较低的等级,如-O1甚或-O0 -g2 -ggdb(用来报告错误和检查可能存在的问题),再重新编译。


3、调试信息的处理

-g
-g1
-g2
-g3

例子:

[fedora@localhost day02_r2]$ gcc main1.c -omain6 -g

结果:
-rwxrwxr-x. 1 fedora fedora 4675 Feb  5 19:07 main
-rwxrwxr-x. 1 fedora fedora 5491 Feb  5 19:15 main6

可以看出main6比main要大得多

4、-c 、 -E 、 -S 选项
-c  //只编译,不连接,产生 .o 文件
     如 gcc -c main.c  //这时便会产生main.o文件
-E  // 预编译
     如gcc -E main1.c -ohehe
 
这时,在 hehe 文件中,你会看到以下信息
# 1 "main1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main1.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 363 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 365 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 366 "/usr/include/sys/cdefs.h" 2 3 4
# 364 "/usr/include/features.h" 2 3 4
# 387 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4






# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 5 "/usr/include/gnu/stubs.h" 2 3 4




# 1 "/usr/include/gnu/stubs-32.h" 1 3 4


-S //产生汇编文件

例子:
[fedora@localhost day02_r2]$ gcc -S main1.c //将main1.c作为汇编文件进行编译
[fedora@localhost day02_r2]$ gcc -x assembler main1.s -oxixi //将main1.s作为好汇编文件进行编译连接,并承生成输出文件xixi

5、-D 、 -std 、-x 选项
-D //在命令行中指定宏

例子:
#include <stdio.h>

int main(){

   printf("%d\n",NUM);
}

这时如果在命令行中输入:
[fedora@localhost day02_r2]$ gcc test.c -otest
会报以下的错误信息:
test.c: In function ‘main’:
test.c:5:18: error: ‘NUM’ undeclared (first use in this function)
test.c:5:18: note: each undeclared identifier is reported only once for each function it appears in

这时应该:
[fedora@localhost day02_r2]$ gcc test.c -otest -DNUM=5
执行程序,运行结果为:
[fedora@localhost day02_r2]$ ./test
5


-x  //指定要用哪一种语言进行编译
如:
gcc -x c main1.c //把main1.c按照C语言的标准进行编译
gcc -x none main1.c //自动判定类型并进行编译
gcc -x assembler main1.c //把main1.c按照汇编语言的标准进行编译

-std //指定要使用哪一种标准进行编译
如:
gcc -std=c89 main1.c  //按照c89的标准编译main1.c
gcc -std=c99 main1.c //按照c99的标准编译main1.c

main1.c
#include <stdio.h>

int main(){
   for(int i=0; i <10 ; ++i);
   return 0;
}

这时,如果采用c89的标准进行编译,会报错:
[fedora@localhost day02_r2]$ gcc -std=c89 main1.c
main1.c: In function ‘main’:
main1.c:4:4: error: ‘for’ loop initial declarations are only allowed in C99 mode
main1.c:4:4: note: use option -std=c99 or -std=gnu99 to compile your code

这时如果采用c99的标准进行编译,则不会报错:
[fedora@localhost day02_r2]$ gcc -std=c99 main1.c

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帅气的东哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值