(1)预编译:
gcc -E main.c -o main.i
(2)编译
gcc -S main.i -o main.s
(3)汇编
gcc -c main.s -o main.o
(4)链接
gcc main.o -o main
执行: ./main
或者:全路径/main
2.编译链接的过程
(1)main.c
通过预编译
生成
main.i
文件
(2)main.i
通过编译生成
main.s
文件
(3)main.s
通过汇编生成
main.o
文件
(4)链接阶段
:
将所有的
.o .a(
静态库文件
) .lib(
库文件
) .obj
文件链接起来
,
生成
.out
文件
(5)ELF
格式的可执行文件
.out
文件
(Windows
生成的是
.ext
文件
)
3.编译链接各阶段的作用
(1)预编译阶段:
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;
c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释
;
e)添加行号和文件名标识
,
以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号
;
f)
保留所有的
#pragma
编译器指令
,
因为编译器需要使用它们
;
(2)编译阶段
词法分析
,
语法分析
,
语意分析
,
代码优化
,
汇总符号
;
(3)汇编阶段
将汇编指令翻译成二进制格式
,
生成各个
section,
生成符号表
(4)链接阶段
a)
合并各个
section,
调整
section
的起始位置和段大小
,
合并符号表
,
进行符号解析
,
给符
号分配虚拟地址
;
b)符号重定位,
即在使用符号的地方全部替换成符号的虚拟地址
;
4.执行
如何启动一个进程
:
路径+
可执行文件名
可以把可执行文件放到
/usr/bin
就可以省略路径了
5.一步执行
(1)直接生成.o文件
可以三步合为一步
,
即不经过预编译
,
编译
,
汇编三步
,
直接一步生成
.o
文件
:
gcc -c main.c -o main.o
gcc -o main main.o
(2)可以四步合为一步:
gcc -o main main.c
6.多个源文件
(1)n+1
gcc -c main.c
gcc -c add.c
gcc -c max.
gcc -o main main.o add.o max.o
(2)一步完成
gcc -o main main.c add.c max.c
7.g++
gcc
误区
:
不能编译
c++
文件
(gcc
可以编译
c++
文件
)
gcc -o mainc++ mainc++.cpp
-lstdc++
(
指明用
c++
的标准库
)