[嵌入式]Gcc生成静态库和动态链接库

本文详细介绍了如何使用Gcc在Linux系统中生成静态库和动态库,包括hello实例和静态库.a与.so库的创建过程。通过对比静态库和动态库的优缺点,如静态库的磁盘占用和动态库的运行效率,展示了它们在不同场景的应用。同时,文章通过实例测试演示了静态链接和动态链接的步骤,并探讨了重名库时gcc的选择规则。
摘要由CSDN通过智能技术生成

一、用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的运行结果报错说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值