高级语言编译全过程:预处理→编译→汇编→链接
纯汇编编译全过程:汇编→链接
【基础知识--编译链接】
1.汇编 / 编译(生成语言无关中间代码)
-- C→中间语言,ASM→中间语言,DLX→中间语言
-- 会包含代码,函数定义
-- 可以是很多个独立文件
[拓展:中间语言]
-- 中间语言在计算机科学中,是指一种应用于抽象机器的编程语言。
-- 源自于编译器,在编译器将源代码编译为目的码的过程中,会先将源代码转换为一个或多个的中间表述,以方便编译器进行代码优化,并产生出目的机器的机器语言。
-- 中间语言介于高级和低级之间,不像汇编直接面对硬件编程,也不像Java完全隔离于硬件。
2.链接(生成平台相关的可执行二进制代码)
-- 中间语言→Linux(elf),mac(maco),windows(exe/dll)
-- 将多个中间文件的代码组合起来
-- 链接的多个中间文件的函数要声明齐全
3.动态链接和静态链接
(1)动态链接
-- 基本思想:把程序的模块相互划分开来,不对这些组成程序的目标文件进行链接,等到程序要运行时才进行链接,即把链接这个过程推迟到了运行时再进行。
-- 目的:解决空间浪费和更新困难的问题
-- 过程:在可执行文件装载时或运行时,由OS的装载程序加载库。可执行文件包含一个import directory表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。(这是大多数OS包括windows和linux采用的,还有一种叫动态链接叫运行时链接,这里不赘述)
-- 类型:可以动态链接的库,Windows上是DLL,UNIX或Linux是Shared Lirary
-- 缺点:可执行程序依赖分别存储的库文件才能正确执行。若库文件被删除、移动、重命名或被替换为不兼容版本,则可执行程序就可能工作不正常。(DLL-hell)
(2)静态链接
-- 基本思想:由链接器在链接时将库的内容加入到可执行程序中的做法。
-- 缺点:生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间,不能随时更新。
-- 优点:对SEO(搜索引擎优化)有很大益处,对服务器的负载很小
【基础知识--C函数】
1.声明和定义的区别
-- 声明只是告诉编译器有这么一个变量 / 函数
-- 定义是告诉编译器这个变量会占用多少内存,这个函数具体的代码是如何
2.先声明后调用
-- 标准ascii-c所有的函数都要在使用前先声明。
3.若函数的定义在其它文件,要通过extern指定。
(有的gcc版本若发现函数只有声明没有定义,默认是extern,可不用专门指定)
-- gcc main.c:编译同时链接,若只有声明,没有函数定义,会报错。
-- gcc -c main.c:只编译,生成中间文件,链接时给出函数定义即可。