编译器
Linux环境下gcc用来编译c语言,g++用来编译c语言或者c++
- 程序的编译过程
预处理-编译-汇编-链接
预处理
- 宏替换
- 头文件展开
- 去注释
对于gcc/g++需要添加-E命令行参数,生成的文件对应后缀为“.i”。
命令: gcc -E test.c -o test.i
告诉gcc或者g++,在编译过程中,完成预处理之后就停下来。
编译
语法语义的检测,并生成汇编代码-s,完成编译停止生成一个.s文件。
命令: gcc -s test.c -o test.s
汇编
汇编生成机器代码,-c 完成汇编停止生成.o文件
命令: gcc -c test.c -o test.o
.o文件对标到Windows当中就是目标程序(xxx.obj)
链接
将多个目标和库链接在一起,生成可执行程序
命令: gcc test.o -o text1
或者直接编译
命令: gcc text.c -o text2
链接方式
链接方式: gcc默认链接方式为动态链接
动态链接: 链接动态库,将库中的函数符号信息表记录到可执行程序中,并没有把函数实现写入程序,程序文件比较小,并且运行时在内存中多个程序可以使用同一个动态库,降低内存中的代码冗余。当时运行时需要依赖动态库的存在,加载动态库到内存。
静态链接: 链接静态库,将库中使用的函数实现写入可执行程序文件,程序文件比较大。有可能会造成内存中代码冗余,但是运行不需要依赖。