C++之动态库与静态库的制作与使用

(本文是作者在牛客网上c++高并发服务器课程的学习整理)

  • 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用 者一些可以直接拿来用的变量、函数或类。
  • 库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
  • 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行调用api时由系统动态加载到内存中供程序调用。
  • 库的好处: 1.代码保密 2 .方便部署和分发

1. 静态库

命名规则
Linux:libxxx.a,lib固定前缀,xxx库名字,a固定后缀
Windows: libxxx.lib

静态库的制作与使用

在这里插入图片描述

制作

gcc -c test.c//test.c为需要打包成库的文件,此行生成test.o文件
ar rcs libtest.a test.o // 此行用ar工具将.o文件打包
// r-将文件插入备存文件
// c-建立备存文件
// s-索引

使用

gcc main.c -o main -I "head file path" -L "库文件path" -l "库名字(libtest.a中的test)"
./main

2. 动态库

命名规则
Linux:libxxx.so,lib固定前缀,xxx库名字,so固定后缀
Windows: libxxx.dll

动态库的制作与使用

在这里插入图片描述

制作

gcc -c -fpic test.c //test.c为需要打包成库的文件,此行生成.o文件 
// -fpic或者-fPIC,得到与位置无关的代码(动态库特点)
gcc -shared test.o libtest.so // 此行将.o文件打包,得到动态库

使用

程序启动之后,动态库会被动态加载到内存中,需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so完成,先后搜索elf文件的以下:

  1. DT_RPATH段
  2. 环境变量LD_LIBRARY_PATH
// 法一:用户级别
vim ~/.bashrc
// 在.bashrc文件末尾插入下行,保存并退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"库文件目录"
//更新一下
source ~/.bashrc
//使用
gcc main.c -o main -I "head file path"
./main 
// 法二:系统级别
sudo vim /etc/profile
// 在profile文件末尾插入下行,保存并退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"库文件目录"
//更新一下
source /etc/profile
// 使用
gcc main.c -o main -I "head file path"
./main 
  1. /etc/ld.so.cache文件列表
sudo vim /etc/ld.so.config
// 在文件末尾插入下行,保存并退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"库文件目录"
//更新一下
sudo ldconfig
// 使用
gcc main.c -o main -I "head file path"
./main 
  1. /lib/, /usr/lib目录
    将库文件放入/lib/,/usr/lib里面,但是不推荐这种方式,因为这两个文件夹里本来库文件就很多,可能会重名覆盖。

可以通过 ldd main命令检查动态库依赖关系

3. 静态库与动态库的差异

区别:链接阶段的处理不同,分别成为静态链接方式和动态链接方式。(库很小用静态,库很大用动态)。
静态库:GCC进行链接时,会把静态库中代码打包到可执行程序中。
在这里插入图片描述

动态库:GCC进行链接时,动态库的代码不会被打包到可执行程序中。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值