现在的位置: 首页 > 综合 > 正文

C学习笔记—-链接,编译

2013年10月18日 ⁄ 综合 ⁄ 共 915字 ⁄ 字号 评论关闭
文章目录

gcc编译一个hello world程序主要经历四个步骤:

1.预处理

2.编译

3.汇编

4.链接

------------------------------------------------------------------------------------------

一 预编译:

examp:gcc -E hello.c -o hello.i

预编译过程主要处理源代码中的以“#”开始的指令.比如:“#include”, "#define"等。处理规则如下:

(1)删除“#define”, 展开所有的宏定义

(2)处理预编译指令。如“#if”, “#ifdef”, “#elif”

(3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的未知。

(4)删除所有的注释“//”和“/**/”

经过编译后的.i文件不包行任何宏定义,已经被展开。包含的头文件也插入到.i当中。

二 编译:

gcc -S hello.i -o hello.s

进行一系列的词法分析,语法分析,优化后产生的相应的汇编代码文件。属于核心部分。现在的GCC把预编译和编译两个步骤合并为一个。
是使用一个叫做ccl的程序来完成的

三 汇编

汇编是将汇编代码转变成机器可以执行的指令,每一个汇编指令都对应一条机器指令。

as hello.s -o hello.o

四 链接

打包成一个静态库

ar rs libstack.a stack.o push.o pop.o is_empty.o

库文件名都是以lib 开头的,静态库以.a作为后缀,表示Archive。ar命令类似于tar 命令,起一个打包的作用,但是把目标文件打包成静态库只能用ar命令而不能用tar 命令。选项r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包中已有同名文件就替换成新的。s是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。

 gcc main.c -L. -lstack -Istack -o main

-L选项告诉编译器去哪里找需要的库文件,-L. 表示在当前目录找。-lstack告诉编译器要链接libstack 库,-I选项告诉编译器去哪里找头文件。注意,即使库文件就在当前目录,编译器默认也不会去找的,所以-L.选项不能少。

抱歉!评论已关闭.