Linux--编译链接(过程、原理、执行、多个文件)

发布于:2022-11-28 ⋅ 阅读:(444) ⋅ 点赞:(0)

1.编译链接四个步骤:

(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++ 的标准库 )
本文含有隐藏内容,请 开通VIP 后查看