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]
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
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
-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(用来报告错误和检查可能存在的问题),再重新编译。
-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
-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
# 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
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
[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
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