静态库、共享库的封装与使用

静态库

​ 就是目标文件的集合,调用静态库文件就是把静态库中二进制指令拷贝到你的可执行文件中

​ 优点:速度相对比共享库较快,可执行文件运行时不需要依赖静态库

​ 缺点:可执行文件相对较大,当静态库修改后,可执行文件需要重新编译。

例如现在有一个hello函数需要封装

1、编写hello.c文件
#include <stdio.h>
void hello(void)
{
	printf("hello,world\n");
}

2、编译hello.c文件生成目标文件hello.o
gcc -c hello.c

3、打包目标文件生成静态库
ar -r libhello.a hello.o

4、成功生成目标文件
系统提示 ar: creating libhello.a

5、使用hello.a
	5.1、在当前文件下使用
	gcc test.c -libhello.a
	5.2、在当其他文件下使用
	gcc test.c -L./lib -lhello
	5.3、如果嫌麻烦,不想写路径。可以直接把自己的静态库添加到系统环境变量中
	1、pwd获取当前hello.a的位置 获取到的结果是 /ubuntu/lib 备用
	2、vim ~/.bashrc 打开(系统配置,建议修改时在最后且表上注释)
	3、export LIBRARY_PATH=$LIBRARY_PATH:/ubuntu/lib
	4、source ~/.bashrc 重新编译
	5、gcc test.c -lhello 成功~

共享库(ldd ./a.out 查看文件依赖的库)

​ 就是没有入口的可执行文件的集合,调用共享库时就是记录共享库二进制的指针的位置即可。

​ 当执行可执行文件时,共享库就会一并加载到内存中,可执行文件就可以跳转到共享库中运行

静态库和共享库的辅助工具

​ 优点:可执行文件相对较小,当共享库文件修改后,可执行文件不需要重新编译

​ 缺点:运行速度比静态库慢,可执行文件运行时也需要依赖共享库

例如现在有一个hello函数需要封装

1、编写hello.c文件
#include <stdio.h>
void hello(void)
{
	printf("hello,world\n");
}

2、编译hello.c文件生成目标文件hello.o
gcc -fpic -c helloc.c

3、打包目标文件生成共享库
gcc -shared -fpic hello.o -o libhello.so

4、使用hello.a
	4.1、在当前文件下使用
	gcc code.c libhello.so
	不会报错 会成功生成a.out
	但是你运行a.out会报错
	./a.out: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
	4.2、我们将hello.so放入到系统配置中
		1、vim ~/.bashrc
		2、export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ubuntu/lib
		3、source ~/.bashrc
		4、这时再运行a.out成功!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值