更多相关内容...>>Linux GCC 编译过程
Linux GCC 编译过程
目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等.
D2dUa9 http://blog.numino.net/
Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
01Uz2f http://blog.numino.net/
使用GCC编译程序时,编译过程可以被细分为四个阶段:
gXn8RJ http://blog.numino.net/
◆ 预处理(Pre-Processing)
ARbify http://blog.numino.net/
◆ 编译(Compiling)
3a7F5a http://blog.numino.net/
◆ 汇编(Assembling)
xbJdIx http://blog.numino.net/
◆ 链接(Linking)
9R3b37 http://blog.numino.net/
.c为后缀的文件,C语言源代码文件;
xGFqEo http://blog.numino.net/
.a为后缀的文件,是由目标文件构成的档案库文件;
hkaKij http://blog.numino.net/
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
zbrcFO http://blog.numino.net/
.h为后缀的文件,是程序所包含的头文件;
NmJtIs http://blog.numino.net/
.i 为后缀的文件,是已经预处理过的C源代码文件;
s2ARF5 http://blog.numino.net/
.ii为后缀的文件,是已经预处理过的C++源代码文件;
SHF23S http://blog.numino.net/
.m为后缀的文件,是Objective-C源代码文件;
M1r63P http://blog.numino.net/
.o为后缀的文件,是编译后的目标文件;
U4LN01 http://blog.numino.net/
.s为后缀的文件,是汇编语言源代码文件;
cVbfS7 http://blog.numino.net/
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
wW4Q5m http://blog.numino.net/
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
QpVqHQ http://blog.numino.net/
例程1:hello.c
JLTTQo http://blog.numino.net/
#include
7KPXEo http://blog.numino.net/
int main(void)
3LG5fw http://blog.numino.net/
{
5dbK3E http://blog.numino.net/
printf ("Hello world, Linux programming!\n");
4M60br http://blog.numino.net/
return 0;
O9uyKR http://blog.numino.net/
}
Wrn9Az http://blog.numino.net/
然后执行下面的命令编译和运行这段程序:
75FCgr http://blog.numino.net/
# gcc hello.c -o hello
rk9hbW http://blog.numino.net/
# ./hello
56yH05 http://blog.numino.net/
Hello world, Linux programming!
DNnlK1 http://blog.numino.net/
首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序.
oUmKzk http://blog.numino.net/
◆ 预处理(Pre-Processing)
M2Noi5 http://blog.numino.net/
使用-E参数可以让GCC在预处理结束后停止编译过程:
QUX3y9 http://blog.numino.net/
# gcc -E hello.c -o hello.cpp
yr26yR http://blog.numino.net/
◆ 编译(Compiling)
ei45z8 http://blog.numino.net/
下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
wNhsJz http://blog.numino.net/
# gcc -x cpp-output hello.cpp -o hello.o
iWmxni http://blog.numino.net/
或者
xBjwh5 http://blog.numino.net/
# gcc -c hello.cpp -o hello.o
Lp00PK http://blog.numino.net/
◆ 汇编(Assembling)
nWfLXq http://blog.numino.net/
◆ 链接(Linking)
4y7M2n http://blog.numino.net/
# gcc hello.o -o hello
G3kRjV http://blog.numino.net/
汇编应该调用as,这里应该是一起完成了
rjS3bm http://blog.numino.net/
gcc主要参数:
vy6TZ7 http://blog.numino.net/
-o 定义输出文件
Nf0U9Q http://blog.numino.net/
-E 完成预处理/预编译停止
b9uJ6H http://blog.numino.net/
-c 只编译生成.o,不连接
6d11QN http://blog.numino.net/
-x 指定编译步骤
3Q464w http://blog.numino.net/
-g gdb调试用,在可执行程序中包含标准调试信息
G05Y54 http://blog.numino.net/
-O,O1,O2,O3,O4,O5 优化级别
sz1uji http://blog.numino.net/
-w 关闭所有警告
0ahdDt http://blog.numino.net/
-Wall 允许所有有用的警告
Im9fej http://blog.numino.net/
-DFOO=BAR 定义预处理宏FOO的值为BAR
60Jk96 http://blog.numino.net/
-IDIRNAME 将DIRNAME加入到包含文件的搜索目录中去
wuoaI4 http://blog.numino.net/
-LDIRNAME 将DIRNAME加入到库文件文件的搜索目录中去
lyjHKb http://blog.numino.net/
-static 静态链接库
y1Mux4 http://blog.numino.net/
-lFOO 动态连接库,名为libFOO.o/libFOO.so(2.4/2.6)
9NlP98 http://blog.numino.net/
-mcpu=CPU TYPE 针对不同CPU作不同的优化,比如-m386,-mpentiumpro
更多相关内容...>>Linux GCC 编译过程

Bug报告 |  免责声明 |  联系我们 |  加入收藏

Copyright © 2006 NuminoStudio(www.numino.net) All Rights Reserved