你知道linux 静态库和共享库?
1、静态库和共享库
静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。
2、库存在的意义库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
3.静态库 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar 命令将很多.o转换成.a,成为静态库
静态链接库libcool.a 遵从GNU/Linux 规定的静态链接库命名规范,必须是”libyour_library_name.a”
动态库的后缀是.so,它由gcc加特定参数编译产生。 4、动态库
在GNU/Linux 中动态链接文件,必需通过链接器ld 生成。假设我们有hot.c other.c 等文件要生成动态链接库libhot.so 。首先使用如下指令得到相应的object 文件hot.o 和other.o gcc -fPIC -c hot.c gcc -fPIC -c other.c 参数-fPIC 指定生成的object 文件为位置无关代码(position-independence code),只有PIC 可以被用作生成动态链接库。然后使用如下指令得到动态库:
ld -Bshared -o libhot.so hot.o other.o 或者可以使用编译器的ld wrapper: gcc -shared -o libhot.so hot.o other.o 也可以使用编译器直接生成动态库: gcc -fPIC -shared -o libhot.so hot.c other.c 这里选项-shared 指示目标文件的类型是动态链接库,动态库的命名规范是”libyour_library_name.so”