C语言静态库和共享库详解

3 篇文章 0 订阅
2 篇文章 0 订阅

库:
库就是目标文件的集合,我们把不需要升级更新维护的代码打包合并在一起方便使用,也可以对源代码进行保密。
静态库:
静态库在使用时是把被调用的代码复制到调用模块中,然后再执行程序时,静态库就不需要了。
静态库的执行速度快,但占用空间大,当库中的内容发生变化时,需要重新编译生成程序,因此不能轻易修改库中的内容。
共享库:
只是在调用模块中嵌入调用代码在库的相对位置的地址,然后再执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中的代码的指令时跳转到共享中执行,执行完毕后再跳转回来。
占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),相对于静态库执行效率略低

静态库的扩展名为 .a ,共享库(动态库)的扩展名为 .so 。
静态库:
1、创建静态库
编写源代码:vi .c/.h
编译源代码:gcc -c xxx.c ->xxx.o
打包生成静态库:ar -r libxxx.a x1.o x2.o …
ar命令的一些参数:
-r 把目标文件添加到静态库中,已经存在的 更新,如果不存在则创建库文件
-q 将目标文件追加到静态库的末尾
-d 从静态库中删除目标文件
-t 显示静态库中有哪些目标文件
-x 把静态拆分成目标文件
2、调用静态库
三种方法:
第一种:直接调用:调用者和库要在同一目录下
gcc main.c libxxx.a
./a.out
第二种:设置环境变量:设置方法与C_INCLUDE_PATH类似
1、打开 vim ~/.bashrc
2、在文件末尾,添加一行 export LIBRARY_PATH=$LIBRARY_PATH:库文件
3、重新加载配置文件 source ~/.bashrc
4、编译时要指定库名
gcc main.c -lmath(库名)
第三种:设置编译参数:-L路径
gcc main.c -L路径 -lmath(库名)

3、运行静态库
在编译时已经把被函数的二进制复制到可执行文件中了,在
执行时不再需要静态库文件。

共享库:
1、创建共享库
编写源代码:vi .c/.h
编译出位置无关目标文件:
gcc -c -fpic xxx.c -> xxx.o
链接生成共享库:
gcc -shared x1.o x2.o x3.o … -o libxxx.so
2、调用共享库
三种方法:
第一种:直接调用:调用者和库要在同一目录下
gcc main.c libxxx.so
./a.out
第二种:设置环境变量:设置方法与C_INCLUDE_PATH类似
1、打开 vim ~/.bashrc
2、在文件末尾,添加一行 export LIBRARY_PATH=$LIBRARY_PATH:库文件
3、重新加载配置文件 source ~/.bashrc
4、编译时要指定库名
gcc main.c -lmath(库名 -l + libxxx 去掉lib)
第三种:设置编译参数:-L路径
gcc main.c -L路径 -lmath(库名)

3、运行共享库
在使用共享库时,调用者只是记录了被代码在库中的位置,因此在执行时需要共享库同时被加载
操作系统会根据LD_LIBRARY_PATH环境变量的设置来加载共享库

动态加载共享库:
函数:
dlopen 加载共享库
dlsym 获取标识符地址并使用
dlclose 卸载共享库
dlerror 获取错误信息

辅助工具:
nm:查看目标文件、可执行文件、静态库、共享库中的符号列表
ldd:查看可执行程序所依赖的共享库有哪些
strip:减肥, 去除掉目标文件、可执行文件、静态库和共享库中的符号列表、调试信息
objdump:显示二进制模块的反汇编信息

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值