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

库(Library)

库的定义

在Linux操作系统中,库(Library)是一段编译好的、可重用的代码,它能够被其他程序或应用程序在运行时调用。库可以提高代码的模块化,使得开发者可以共享和重用代码,从而提高开发效率,减少冗余。

库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。

由于windows和linux的本质不同,因此库的二进制是不兼容的。(Linux中的C运行库是glibc, 由GUN发布)

在Linux的平台下,静态库文件的后缀是 .a ,动态库的后缀是 .so 。
在window的平台下,静态库文件的后缀是 .lib ,动态库的后缀是.dll

库的分类

静态库(Static Libraries)

静态库在程序编译时会被复制到目标代码中, 以.a结尾。

优点:程序运行时将不再需要该静态库,运行时无需加载库,运行速度更快,可移植性好。

缺点:静态库中的代码复制到了程序中,因此体积较大;静态库升级后,程序需要重新编译链接。

静态库的制作

1、将源文件编译生成目标文件

gcc -c .c文件 -o .o文件

2、创建静态库用ar命令,将多个.o生成.a

ar crs lib.a文件 .o文件

注意:静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

3、测试使用静态库

gcc main.c -L . -l fun

注意:-L指定静态库的路径,-l指定库名

执行:./a.out

动态库(Shared Libraries)

动态库是在程序运行时才被载入代码中,也叫共享库,以.so结尾。

优点:程序在执行时加载动态库,代码体积小;程序升级更简单;不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行速度慢,运行时还需要动态库的存在,移植性较差。

动态库的制作

1、用gcc来创建共享库

gcc -fpic -c fun.c -o fun.o//-fpic创建与地址无关的编译程序

gcc -shared fun.o -o libmyfun.so//生成动态库

2、测试使用动态库

sudo cp libmyfun.so /lib

gcc main.c -l myfun

./a.out : 可以正常编译通过,但是运行报错

./a.out: error while loading shared libraries: libmyfun.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件,所以不用-L加路径了,直接gcc main.c -lmyfun就可以了

解决方法(有三种):

1) 把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(终端关闭,环境变量就没在了)

3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

Makefile创建库文件

Make工具教程

https://www.jb51.net/article/281278.htm

LIB_NAME?= test                                                                                  
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME  ?= lib$(LIB_NAME).so
//?=表示如果该变量没有赋值,则进行赋值操作all: static_library shared_librarystatic_library: gcc -c *.c;ar  -cr $(STATIC_NAME) *.o;shared_library:gcc -shared -fpic -o $(SHARE_NAME) *.c;clean:rm -rf *.orm -rf *.a *.so

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kafka 常用的传输和序列化数据方式
  • 51单片机——实时时钟
  • 数分基础(06)商业分析四种类型简介
  • 技术Leader在训练团队思考力中的核心职责
  • 环信高质量全球网络——70%丢包环境,消息100%送达,抗弱网能力大幅提升!
  • DAMA数据管理知识体系(第4章 数据架构)
  • B站视频自动驾驶master(2)
  • ARP协议(原理,特点,报文格式,具体过程),ARP缓存(有效时间,为什么),ARP欺骗(定向断网,成为中间人),RARP简单介绍
  • leetcode 2816.翻倍以链表形式表示的数字
  • 访问Neo4j验证失败(The client is unauthorized due to authentication failure.)
  • ubuntu环境下部署LNMP集成环境超详细图文教程
  • <Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
  • 【行测笔记】
  • AN7536PT时钟电路
  • 基于VsCode和Git的代码版本管理
  • 2017届校招提前批面试回顾
  • go语言学习初探(一)
  • hadoop集群管理系统搭建规划说明
  • Logstash 参考指南(目录)
  • PHP 7 修改了什么呢 -- 2
  • SpingCloudBus整合RabbitMQ
  • webpack4 一点通
  • 百度地图API标注+时间轴组件
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 和 || 运算
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何利用MongoDB打造TOP榜小程序
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 我是如何设计 Upload 上传组件的
  • 栈实现走出迷宫(C++)
  • 自定义函数
  • 自制字幕遮挡器
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​力扣解法汇总946-验证栈序列
  • # dbt source dbt source freshness命令详解
  • #Linux(帮助手册)
  • #数据结构 笔记三
  • (19)夹钳(用于送货)
  • (4)(4.6) Triducer
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八)c52学习之旅-中断实验
  • (层次遍历)104. 二叉树的最大深度
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (五)activiti-modeler 编辑器初步优化
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(五):遍历指定目录下资源文件并更新