对gcc 常用选项和简单编写

来源:互联网 发布:软件系统安全策略 编辑:程序博客网 时间:2024/06/14 02:39

一、编译器gcc

1、GCC简介

    GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。

2、执行过程

    虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。    命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

3、常用选项
–help
显示 gcc 帮助说明
–target-help
是显示目标机器特定的命令行选项。
-E
预处理后即停止,不进行编译、汇编及连接
-S
编译后即停止,不进行汇编及连接
-c
编译或汇编源文件,但不进行连接
-o file
指定输出文件file,我们都知道程序的编译要经历预处理、编译、汇编以及连接4个阶段。在预处理阶段,主要处理C语言源文件中的#ifdef、#include、以及#define等命令。在与处理过程中,GCC会忽略掉不需要预处理的输入文件,该阶段会生成中间文件*.i。
-l library
-llibrary
进行链接时搜索名为library的库。
例子: gcctest.clmotestIdirdir gcc test.c -I../inc -o test
-Ldir
把dir 加入到搜索库文件的路径列表中。
例子: gccI/home/fooL/home/fooltesttest.cotestDnamename1 gcc -DTEST_CONFIG test.c -o test

-Dname =definition
预定义名为name ,值为definition 的宏。
-static
在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上 无效。
-Wall
会打开一些很有用的警告选项,建议编译时加此选项。

4、不常用选项

–version
显示 gcc 版本号和版权信息
-x language
指明使用的编程语言。允许的语言包括:c c++ assembler none 。 ‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言。
-v
打印较多信息,显示编译器调用的程序。
-###
与 -v 类似,但选项被引号括住,并且不执行命令。
-pipe
使用管道代替临时文件。
-combine
将多个源文件一次性传递给汇编器。
-ggdb
-ggdblevel
为调试器 gdb 生成调试信息。level 可以为1,2,3,默认值为2。
-g
-glevel
生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level 取值同上。
-s
去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
-M
告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个 源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 #include引用的所有文件。生成的规则可 以是单行,但如果太长,就用\’-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。
-O0
禁止编译器进行优化。默认为此项。
-O
-O1
尝试优化编译时间和可执行文件大小。
-O2
更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。
-O3
在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-Os
对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。

0 0