技术开发站45793.com
Linux中静态库和动态库的使用
发布时间:
2024年01月23日
库的概念
介绍:
库是一个二进制文件,包含的代码可被程序调用
标准C库、数学库、线程库…
库有源码,可下载后编译;也可以直接安装二进制包
位置一般放在:/lib /usr/lib
库的知识
库是事先编译好的,可以复用的代码
在os上运行的程序基本上都要使用库,使用库可以提高开发效率
window和Linux下库文件的格式不兼容
Linux下包含静态库和动态库
静态库的特点
编译时把静态库中相关代码复制到可执行文件中
程序中已包含代码,运行时不再需要静态库
程序运行时无需加载库,运行速度更快
占用更多磁盘和内存空间
静态库升级后,程序需要重新编译链接
案例如下:
注:此时生成hello.o文件,但不是可执行文件,没有链接库
静态库创建
静态库
创建静态库步骤:
1 . 编写库文件代码,编译为.o 目标文件。
2. ar 命令 创建 libxxxx.a 文件
ar -rsv libxxxx.a xxxx.o
ar 参数如下:
注意:1 静态库名字要以lib开头,后缀名为.a
2 没有main函数的.c 文件不能生成可执行文件。
链接错误:
test.c:(.text+0x15):对‘hello’未定义的引用
collect2: error: ld returned 1 exit status
含义:表示hello函数在编译的源码内没有找到实现
解决:实现代码或者找到对应函数的库并且链接它。
链接静态库:
gcc -o 目标文件 源码.c -L路径 -lxxxx
-L 表示库所在的路径
-l 后面跟库的名称
案例如下:
注:ar -t .a文件:可以得到是由哪个文件得到的
如何使用上述的静态库
注:出现以下错误是由于没有链接库
链接库后得到如下(如果将test可执行文件转移到其他目录下,不依赖库文件,也可以执行):
动态库
编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
程序不包含库中代码,尺寸小
多个程序可共享同一个库
程序运行时需要加载库
库升级方便,无需重新编译程序
使用更加广泛
共享库创建
动态库的生成步骤:
生成位置无关代码的目标文件
gcc -c -fPIC xxx.c xxxx.c …
生成动态库
gcc -shared -o libxxxx.so xxx.o xxx.o …
编译可执行文件
gcc -o 目标文件 源码.c -L路径 -lxxxx
代码如下:
注:执行动态库的可执行文件错误
./test: error while loading shared libraries: libmyheby.so: cannot open shared object file: No such file or directory
含义:可执行文件所使用的动态库找不到
解决办法:
找到动态库,添加到/usr/lib里面
或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录,注意在这么加的路径后,只能在当前shell有效
添加在~/.bashrc 文件里面,适用于所有shell,加入export LD_LIBRARY_PATH = LIB_PATH
在/etc/ld.so.conf.d/下加入路径
如何找到一个文件的动态库的名称,如下:
文章来源:https://blog.csdn.net/weixin_58036810/article/details/135779555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!
最新文章
Python教程
深入理解 MySQL 中的 HAVING 关键字和聚合函数
Qt之QChar编码(1)
MyBatis入门基础篇
用Python脚本实现FFmpeg批量转换
手写RTOS准备
你们做外贸主要的获客渠道有哪些?
【大模型AIGC系列课程 5-2】视觉-语言大模型原理
DOS命令
Python中NumPy详解
java.lang.RuntimeException: /packages cannot be represented as URI 解决方法
如何清空电脑所有数据?3个方法,快速释放空间!
什么是静态路由?它又该怎么配置?
mipi屏幕的供电和背光ledk
BGP AS-Path 选路试验