1.编译流程
编译就是将高级语言的代码转化成可执行的二进制目标代码。主要包含四个步骤:预处理、编译、汇编、链接。
预处理:就是对各种预处理命令的处理,主要是宏替换、文件引入、去除空行和注释等。linux系统中预处理命令:gcc -E test.c -o test.i。-E表示gcc在预处理后停止编译、汇编和链接操作。
编译:将预处理后的代码翻译成汇编语言。会先分析后综合,分析就是进行词法、语法、语义分析和中间代码的生成,综合就是代码优化和代码生成。编译命令gcc -c test.i -o test.s。
汇编:把编译生成的汇编代码.s文件转化成为可执行的二进制的目标文件。gcc -c test.s -o test.o。
链接:把多个的目标代码和所需的库文件链接生成目标代码。gcc test.o -o test。-o是一个重命名选项,不使用-o选项时默认的是生成a.out,使用后可以生成可执行文件。
执行文件:./test。删除目标文件:rm -rf test。生成可执行文件:gcc -o test test.c。查看文件详情ls -lh。
2.静态库和动态库
静态库是目标文件(.o)的集合,一般以.a结尾,只存在生成可执行文件阶段。链接器将从库文件中取得所需代码复制到生成的可执行代码中,可执行代码中包含库代码的完整拷贝。多次使用就有多份拷贝,包会比较大;静态库有更新,所有使用它的程序都需要重新编译。命令将目标文件打包生成静态库:ar rcs libtest.a test.o。查看静态库内容:ar t libtest.a。
动态库在链接阶段没有复制到目标代码中,在运行阶段才由系统动态到内存中。系统只要加载一次动态库,系统中不同的程序都可以获得内存中相同动态