链接

来源:互联网 发布:学做淘宝上的编辑 编辑:程序博客网 时间:2024/05/16 15:57

1, 常识:

1) static修饰的全局变量,是私有的, 只能在本模块中使用。 而不经static修饰的全局变量,是公有的, 可以在其他模块中使用。



2, 

 1) 节: 

  目标文件(*.o)用节, 来保存代码或数据。 其中需掌握的是: 

.text  存放已编译的机器代码.data 存放已初始化的全局C变量.bss   存放未初始化的全局C变量,不占据实际空间, 只是个占位符.symtab (符号表) 可以理解为 .data + .bss + externP.S.:1. 关于局部变量, 在运行时保存在栈中2. 关于Extern,全局变量不能重复定义,也就是不同CPP不能用同一个命名相同的全局变量, 但是直接引用,会出“未声明的标识符”的错。所以在引用的cpp文件中,使用extern, (如extern int a) 有点像引用dll内的函数, 是吧。      其实这也告诉我们  全局变量的设置命名等必须要谨慎细心, 尤其是类似于int a (1.cpp) double a (2.cpp) 这个相当于 a1  a2 互不相关

 2)静态库链接:

1)对于每个输入文件, 判断是目标文件(*.o)或是存档文件(*.a 理解为库文件,即许多目标文件组成的集合)   1.1)对于目标文件, 放入E集合, 将未定义的符号放入U(undefined)中, 定义的符号放入D中。   1.2)对于存档文件, 判断是否存在某成员目标文件对U其中一个符号@的定义, 是则将此成员目标文件放入E集合, 修改U (删去未定义符号@)D(添加定义符号@)2)反复进行以上操作, 对于不存在于E集合的存档文件中的某些成员(其实也是目标文件)简单的舍弃3)最后 合并和重定位E集合中的所有目标文件, 输出可执行性文件(如果此时发现U非空, 即仍有未定义符号,则报错)

这也折射出某种诟病, 即目标文件与库文件之间的顺序一旦出错,就会导致编译失败, 因为对于库文件而言,使用与否取决于当前的U与库文件所定义的某符号相关,过早会miss掉应该定义的符号

所以 一般的准则, 就是将未定义的放置在其定义的文件的后面, 对于“交叉”定义(即A定义了B中的某符号, B定义了A中的某符号)可以使用类似A.o B.o A.o等二次定义。



0 0
原创粉丝点击