1. 背景知识
1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 连接(生成可执行文件或库文件)
2. gcc如何完成
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换)
编译(生成汇编)
汇编(生成机器可识别代码)
连接(生成可执行文件或库文件)
在这里涉及到一个重要的概念:函数库
函数库一般分为静态库和动态库两种。
自己总结
gcc mycode.c -0 mytest,后,./mytest就可以编译了,相当于把a.out重命名了
1、只进行预处理:gcc -E mycode.c -0 mycode.i,(预处理后干净的C语言)
2、变成汇编语言(编译)gcc -S mycode.i -o mycode.s(将汇编工作做完,就停下来)
3、汇编(生成机器可以识别代码)gcc -c mycode.s -o mycode.o,(mycode.o是目标文件,将会边工作做完,就停下来了),.obj文件,虽是二进制了,但不可以单独执行,需要经过连接才行。
4、连接,gcc mycode.o -o mytest后,再./mytest可以编译成功,连接过程将可重定位目标二进制和库进行连接形成可执行程序。键盘上的Esc方便记忆
.o和库是如何连接的?1、动静态连接
C语言静态库安装,sudo yum install -y glic-static livsbtdc++-static
gcc mycode.c -o mycode -static,静态连接,gcc默认用动态库,没有静态库,用不了static,-static本质:所以的连接都需要要求全部变为静态连接
动静态的优缺点:
动态库是因为共享库,可以有效节省资源(磁盘,内存,网络完全)等,一旦缺失,各个程序无法运行,静态库:不依赖库,程序可以独立运行,消耗资源,体积大
g++ mycode.cpp -o mycode -static -g(-g是用debug的意思,因为默认是release版本)