静态库和动态库的创建及使用

1、静态链接

静态链接:由链接器在链接时将库的内容加入到可执行程序中。

2、动态链接

动态链接:动态链接:连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序。

静态链接、动态链接编译:

gcc test.c -o test

gcc -static test.c -o test_static

一、静态库的制作及使用

静态库可以认为是一些目标代码的集合,是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分。

按照习惯,一般以“ .a ”做为文件后缀名。静态库的命名一般分为三个部分:

  • 前缀:lib
  • 库名称:自定义
  • 后缀:.a

最终的静态库的名字:lib+库名称+ .a

1、静态库的制作

第一步:将所有的 .c 源文件 生成对应的 .o 文件

 第二步:使用打包工具 a r将准备好的 .o 文件打包为 .a 文件

在使用ar工具时候需要添加参数:-rcs

  • r更新
  • c创建
  • s建立索引

2、静态库的使用

测试文件test.c:

静态库制作完成后进行测试使用:

 参数说明:

  • -L./:表示要连接的库所在目录
  • -I./: I(大写i) 表示指定头文件的目录为当前目录
  • -l(小写L):指定链接时需要的库,去掉前缀和后缀

二、动态库的制作及使用

共享库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。

动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。

按照习惯,一般以“.so”做为文件后缀名。共享库的命名一般分为三个部分:

  • 前缀:lib
  • 库名称:自定义
  • 后缀:.so

所以最终的动态库的名字应该为:lib+库名称+.so

1、动态库制作

第一步:生成目标文件,加编译选项:-fpic

 参数:-fpic 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

第二步:生成共享库,加链接器选项: -shared(指定生成动态链接库)

 第三步:通过 nm 命令查看对应的函数

说明制作成功

2、动态库的使用

引用动态库编译成可执行文件

 执行完毕后运行可执行文件,系统会因为找不到对应库文件报错

动态库加载失败问题解决方法:

1、将自己制作的共享库拷贝到 /lib 或者 /usr/lib

2、临时设置 LD_LIBRARY_PATH:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 库路径

 3、永久设置

把 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 库路径,设置到~/.bashrc或者 /etc/profile文件中:

最后一行添加如下内容:

使环境变量生效

 3、将其添加到 /etc/ld.so.conf 文件中

编辑/etc/ld.so.conf文件,加入库文件所在目录的路径

运行sudo ldconfig -v,该命令会重建/etc/ld.so.cache文件

文件最后添加动态库路径(绝对路径):

使生效:

 4、使用符号链接, 但是一定要使用绝对路径

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态库动态库是在软件开发中常用的文件格式,用于存放可重用的代码和函数。它们的主要区别在于编译链接的方式不同。 静态库是在编译文件的代码和函数直接复制到最终的可执行文件中。使用静态库的优点是可移植性强,执行速度相对较快。使用静态库的步骤如下: 1. 创建静态库:首先,将需要共享的代码和函数编译成目标文件(通常是以 .o 或 .obj 结尾的文件),然后使用静态库工具(如 ar)将目标文件打包成静态库文件(通常是以 .a(Windows)或 .lib(Linux) 结尾的文件)。 2. 链接静态库:在编译可执行文件,需要告诉编译器链接静态库。在使用 GCC 编译器,可以通过使用 -l 和 -L 参数来指定静态库的名称和路径。 动态库是在运行由操作系统加载并链接到可执行文件中。使用动态库的优点是节省内存空间,可以在运行更新文件,但执行速度相对较慢。使用动态库的步骤如下: 1. 创建动态库:与静态库不同,创建动态库,需要在编译目标文件添加位置无关代码(Position Independent Code,PIC)选项。动态库文件格式通常是 .so(Linux)或 .dll(Windows)。 2. 链接动态库:在编译可执行文件,需要告诉编译器链接动态库。在使用 GCC 编译器,可以通过使用 -l 和 -L 参数指定动态库的名称和路径。 总结: - 使用静态库文件的代码和函数会直接复制到可执行文件中,在编译链接。 - 使用动态库文件会在运行由操作系统加载和链接到可执行文件中。 在 Visual Studio Code(VSCode)中使用静态库动态库的步骤与上述相似,但具体的设置和指令可能会有所不同。你可以根据你使用的编程语言和相关工具的文档查找更具体的示例和指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值