一、用Gcc生成静态库和动态库
- 静态库
静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。- 动态库
动态库是在程序执行的时候被链接的。程序执行完,库仍需保留在系统上,以供程序运行时调用- 区别
链接静态库从某种意义上来说是一种复制粘贴,被链接后库就直接嵌入可执行程序中了,这样系统空间有很大的浪费,而且一旦发现系统中有bug,就必须一一把链接该库的程序找出来,然后重新编译,十分麻烦。而动态库刚好弥补了这个缺陷,因为动态库是在程序运行时被链接的,所以磁盘上只需保留一份副本,一次节约了空间,如果发现bug或者是要升级,只要用新的库把原来的替换掉就可以了。然而静态库并不是一无是处了,如果代码在其他系统上运行,且没有相应的库时,解决办法就是使用静态库。而且由于动态库是在程序运行的时候被链接,因此动态库的运行速度比较慢。
(一)hello实例使用库
hello.h文件
#ifndef HELLO H
#define HELLO H
void hello(const char *name);
#endif
hello.c文件
#include <stdio.h>
void hello(const char *name){
printf("Hello %s!\n", name};}
main.c文件
#include "hello.h"
int main(){
hello("everyone");
return 0;}
1、静态链接
2、动态链接
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置. 也就是 不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的。
3、测试
当静态库与动态库重名时,gcc会使用哪个库文件呢?
hello的运行结果报错说明