1.简介:
html
gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一块儿分发的。这个东西功能强大,可是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时不多用到.可是无论装软件仍是写程序,每每都会用到gcc.下面我就gcc最最经常使用的几个选项作一个简要的说明,若是你想对gcc有一个全面的了解,好比你想知道在其余非x86平台上gcc是如何工做的话,你能够用命令:man gcc;算法
gcc [-c|-S|-E] [-std=standard]多线程
[-g] [-pg] [-Olevel]函数
[-Wwarn...] [-pedantic]测试
[-Idir...] [-Ldir...]优化
[-Dmacro[=defn]...] [-Umacro]ui
[-foption...] [-mmachine-option...]spa
[-o outfile] infile....net
-c 编译为目标文件,不链接库命令行
-S 编译为汇编代码
-E 预处理.预处理以后的代码将送往标准输出
-Wwarn... 设置警告,能够设置的警告开关不少,一般用-Wall开启全部的警告
-Olevel 设置优化级别,level能够是0,1,2,3或者s,默认-O0,即不进行优化。.
-Dname=definition... 在命令行上定义宏,有两种方式,-Dname或者-Dname=definition.在命令行上设置宏定义的目的主要是为了在调试的时候设定一些开关, 而在发布的时候再关闭或者打开这些开关便可,固然宏定义也用来对代码进行有选择地编译.另外也还有其余的一些做用.
-Uname 取消宏定义name,做用和上面的正好相反.
-Idir... 把dir加到头文件的搜索路径中,并且gcc会在搜索标准头文件以前先搜索dir.
-llibrary 在链接的时候搜索library库,库是一些archieve文件--其成员是目标文件.若是有文件引用library,library在命令行的位置应该在那个文件以后,所以,越底层的库越要放在后面.好比若是你要链接pcap库,那么你就须要使用-lpcap对源文件进行编译.
-Ldir... 把dir加到库文件的搜索路径中,并且gcc会在搜索标准库文件以前先搜索dir.
-pthread 经过pthreads库加入对多线程的支持,这为预处理和链接设置了标志NaNhread是POSIX指定的标准线程库.
-std=standard 设置采用的标准,该选项是针对C语言的,好比-std=c99表示编译器遵循C99标准.该选项较少使用.并且有时反而会把你搞糊涂.
-o outfile 指定输出文件的文件名,默认为a.out
-mmachine-option... 指定所用的平台.
---------------------------------------------------------------------------------------
2.gcc经常使用选项总结
2.1 常规选项
1、没有任何选项:gcc helloworld.c
结果会在与helloworld.c相同的目录下产生一个a.out的可执行文件。
2、-o选项,指定输出文件名:gcc -o helloworld helloworld.c
-o意思是Output即须要指定输出的可执行文件的名称。这里的名称为helloworld。
3、-c选项,只编译,不汇编链接:gcc -c helloworld.c
-c意思就是Compile,产生一个叫helloworld.o的目标文件
4、-S选项,产生汇编源文件:gcc -S helloworld.c
-S意思就是aSsemble,产生一个叫helloworld.s的汇编源文件
5、-E选项,预处理C源文件:gcc -E helloworld.c
-E意思就是prEprocess。输出不是送到一个文件而是标准输出。固然能够对它进行重定向:
gcc -E helloworld.c > helloworld.txt
2.2 优化选项
1) -O选项,基本优化:gcc -O helloworld.c
-O意思就是Optimize,产生一个通过优化的叫做a.out的可执行文件。也能够同时使用-o选项,以指定输出文件名。如:
gcc -O -o test helloworld.c
即会产生一个叫test的通过优化的可执行文件。
2) -O2选项,最大优化:gcc -O2 helloworld.c
产生一个通过最大优化的叫做a.out的可执行文件。
2.3 调试选项
1) -g选项,产生供gdb调试用的可执行文件:gcc -g helloworld.c
产生一个叫做a.out的可执行文件,大小明显比只用-o选项编译汇编链接后的文件大。
2) -pg选项,产生供gprof剖析用的可执行文件:gcc -pg helloworld.c
产生一个叫做a.out的执行文件,大小明显比用-g选项后产生的文件还大。
------------------------------------------------------------------------------------
3. Gcc的错误类型及对策
Gcc编译器若是发现源程序中有错误,就没法继续进行,也没法生成最终的可执行文件。为了便于修改,gcc给出错误资讯,咱们必须对这些错误资讯逐个进行分析、处理,并修改相应的语言,才能保证源代码的正确编译链接。gcc给出的错误资讯通常能够分为四大类,下面咱们分别讨论其产生的缘由和对策。
第一类∶C语法错误
错误资讯∶文件source.c中第n行有语法错误(syntex errror)。这种类型的错误,通常都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行以前的程序,有时也须要对该文件所包含的头文件进行检查。有些状况下,一个很简单的语法错误,gcc会给出一大堆错误,咱们最主要的是要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。
第二类∶头文件错误
错误资讯∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题,可能的缘由有头文件名错误、指定的头文件所在目录名错误等,也多是错误地使用了双引号和尖括号。
第三类∶档案库错误
错误资讯∶链接程序找不到所需的函数库,例如∶
ld: -lm: No such file or directory
这类错误是与目标文件相链接的函数库有错误,可能的缘由是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,肯定档案库及目录的名称并修改程序中及编译选项中的名称。
第四类∶未定义符号
错误资讯∶有未定义的符号(Undefined symbol)。这类错误是在链接过程当中出现的,可能有两种缘由∶一是使用者本身定义的函数或者全局变量所在源代码文件,没有被编译、链接,或者干脆尚未定义,这须要使用者根据实际状况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而链接过程当中尚未给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时须要使用档案库维护命令ar检查咱们须要的库函数到底位于哪个函数库中,肯定以后,修改gcc链接选项中的-l和-L项。
排除编译、链接过程当中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,能够说只是开了个头。这个过程当中的错误,只是咱们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。咱们写一个程序,到编译、链接经过为止,应该说刚刚开始,程序在运行过程当中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还须要更加深刻地测试、调试和修改。一个程序,稍为复杂的程序,每每要通过屡次的编译、链接和测试、修改。