当前位置: 首页 > news >正文

动态库和静态库的使用

一、什么是库?

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

常见的库类型

共享库 静态库 动态库

win32平台下,静态库通常后缀为.lib,动态库为.dll 。

linux平台下,静态库通常后缀为.a,动态库为.so 。

 

二、静态库 、动态库

所谓静态库,就是在静态编译时由编译器到指定目录寻找并且进行链接,一旦链接完成,最终的可执行程序中就包含了该库文件中的所有有用信息,包括代码段、数据段等。

相对于动态库,静态库的优点在于直接被链接进可执行程序中,之后,该可执行程序就不再依赖于运行环境的设置了(当然仍然会依赖于 CPU指令集和操作系统支持的可执行文件格式等硬性限制)。

所谓动态库,就是在应用程序运行时,由操作系统根据应用程序的请求,动态到指定目录下寻找并装载入内存中,同时需要进行地址重定向。

而动态库的优点在于,用户甚至可以在程序运行时随时替换该动态库,这就构成了动态插件系统的基础。具体使用静态库和动态库,由程序员根据需要自己决定。

另外,需要说明的一点是,从底层实现上,动态库的效率可能会比静态库稍差一点点,注意,这里用了“可能”二字,具体差不差,还得看写程序的人。之所以可能会差,主要原因在于,程序总无法直接调用动态库中的函数符号,而只能通过调用操作系统的runtime enviroment接口来动态载入某个函数符号,同时获得该函数符号在内存中的地址,将其保存为函数指针进行调用,这就在函数调用时增加了一次间接寻址的过程。

三、库的制作和使用

1、静态库的制作:  格式xxxx.a

生成xxx.o文件        gcc calcufuncs.c –c  

使用 ar 命令    xxx.o文件生成xxx.a静态库文件        ar rcs libcalcufunc.a calcufuncs.o  

静态库的使用

gcc calculator.c -lcalcufunc -L ./ -o mainProStatic

         -lcalcufunc  –l是指定要用的静态库,库名砍头去掉lib去尾去掉.a

         -L ./  告诉gcc编译器从-L指定的路径去找静态库,默认是从/usr/lib/usr/local/lib去找

2、动态库的制作              生成xxx.so文件

gcc -shared -fpic calcufuncs.c -o libcalc.so

-shared 指定生成动态库

-fpic  标准,用于编译阶段,在生成目标文件时就得使用该选项。以生成位置无关的代码

动态库的使用

gcc calculator.c -lcalc -L ./ -o mainProDy

  动态库优先从当前路径去找,没找到的话再去 /usr/lib/ 下去找通常动态库拷贝到 /usr/lib/ 下即可:

sudo cp libcalc.so /usr/lib/                

动态库无法加载(引用动态库,怎么指定动态库的位置):

临时设置:在终端进行:export LD_LIBRARY_PATH=“动态库的路径”

带动态库的程序(可以指定该程序运行时候,在LD_LIBRARY_PATH所指定的路径去找库文件)

或者利用脚本

vi start.sh     //创建一个.sh文件

export LD_LIBRARY_PATH="/home/pi/test//动态库的路径"

./mianPrody   //所要执行的程序名称

//在文件夹中输入以上内容

 chmod +x start.sh     //给脚本加可执行的的权限

./start.sh                     //执行该脚本

./mainProDy(用shell脚本运行,脚本需要加权限 chmod +x xxx

http://www.lryc.cn/news/66056.html

相关文章:

  • 前端:20 个常见的前端算法题
  • 【Linux】多线程 --- 线程概念 控制 封装
  • 最长递增子序列的长度 _ 贪心+二分查找 _ 20230510
  • VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  • Scrum敏捷开发和项目管理流程及工具
  • 微服务之配置中心
  • windows下安装OpenCL
  • 前端项目的通用优化策略
  • 关于 IO、存储、硬盘和文件系统
  • 计算机网络期中复习提纲-酷酷的聪整理版
  • clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例
  • 人脸修复增强调研
  • 【Java】继承和多态
  • ThingsBoard集群部署之k8s
  • 【Gorm】如何在 GORM 中实现模型之间的关联?
  • Linux危险命令
  • FPGA入门系列13--异步串口通信
  • k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容
  • 动态规划算法——40道leetcode实例入门到熟练
  • Nmap入门到高级【第十一章】
  • 配置本地Angular环境并使用VsCode调试Angular前端项目
  • 100ASK_全志V853-PRO开发板支持人形检测和人脸识别
  • 简单实现基于UDP与TCP的回显服务器
  • 家用洗地机有什么推荐的吗?家用洗地机哪款好
  • 深度学习与文本聚类:一篇全面的介绍与实践指南
  • AP5153 线性降压恒流驱动芯片 2.5A
  • Unity物理系统脚本编程(下)
  • 容器技术的发展
  • Python Flask request中常见存储参数的介绍
  • php+vue网盘系统的设计与实现