Linux 库

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

目录

一.静态库

1.1静态库生成

1.1.1使用

1.1.2使用


在前面的文章中,我们大概提过库的相关概念,此篇文章,我们将进一步深入介绍库,让我们更加了解 动 静态库
库是提前写好的(对于那些总是被大量写的代码),进行封装
本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:
• 静态库 .aLinux 、 .libwindows
• 动态库 .soLinux 、 .dllwindows

一.静态库

程序在编译链接的时候把库的代码链接到可执⾏⽂件中,程序运⾏的时候将不再 需要静态库。(占内存)

1.1静态库生成

我们前面提到过,为了防止源代码泄漏,我们可以提前编译好,再将该文件和头文件给别人使用,但同时如果文件过多,对自己发送还是对方使用,都会过于麻烦,此处我们将解决该问题
我们需要新用到的命令符

ar 是 gnu 归档⼯具, rc 表⽰ (replace and create)

1.1.1使用

先提前进行编译,再使用ar打包(注:如果使用tar zip打包,发送给别人,别人也许解压,还是麻烦)

bash 复制代码
[lcb@hcss-ecs-1cde zs]$ gcc -c *.c
[lcb@hcss-ecs-1cde zs]$ ll
total 24
-rw-rw-r-- 1 lcb lcb   56 Dec 19 17:57 math.c
-rw-rw-r-- 1 lcb lcb   41 Dec 19 17:57 math.h
-rw-rw-r-- 1 lcb lcb 1240 Dec 19 18:47 math.o
-rw-rw-r-- 1 lcb lcb   60 Dec 19 18:47 test.c
-rw-rw-r-- 1 lcb lcb   31 Dec 19 18:47 test.h
-rw-rw-r-- 1 lcb lcb 1496 Dec 19 18:47 test.o
[lcb@hcss-ecs-1cde zs]$ ar -rc libmy.a *.o
[lcb@hcss-ecs-1cde zs]$ ll
total 28
-rw-rw-r-- 1 lcb lcb 2946 Dec 19 18:48 libmy.a
-rw-rw-r-- 1 lcb lcb   56 Dec 19 17:57 math.c
-rw-rw-r-- 1 lcb lcb   41 Dec 19 17:57 math.h
-rw-rw-r-- 1 lcb lcb 1240 Dec 19 18:47 math.o
-rw-rw-r-- 1 lcb lcb   60 Dec 19 18:47 test.c
-rw-rw-r-- 1 lcb lcb   31 Dec 19 18:47 test.h
-rw-rw-r-- 1 lcb lcb 1496 Dec 19 18:47 test.o

再将文件发给另一个人

bash 复制代码
[lcb@hcss-ecs-1cde ls]$ ll
total 16
-rw-rw-r-- 1 lcb lcb 2946 Dec 19 18:49 libmy.a
-rw-rw-r-- 1 lcb lcb   90 Dec 19 17:57 main.c
-rw-rw-r-- 1 lcb lcb 1240 Dec 19 18:50 math.o
-rw-rw-r-- 1 lcb lcb 1496 Dec 19 18:50 test.o
[lcb@hcss-ecs-1cde ls]$ 

ls进行编译使用

bash 复制代码
[lcb@hcss-ecs-1cde ls]$ gcc -o main main.o
main.o: In function `main':
main.c:(.text+0x1c): undefined reference to `func'
main.c:(.text+0x30): undefined reference to `sun'
collect2: error: ld returned 1 exit status

却说无法找到函数,链接错误,所有我们应该指明哪个库(库的名字不是文件全称,要区前后缀)

-l指明库,找什么库

bash 复制代码
[lcb@hcss-ecs-1cde ls]$ gcc -o main main.o -lmy
/usr/bin/ld: cannot find -lmy
collect2: error: ld returned 1 exit status

但还是出错,原因就是:gcc查找默认去系统查找,,但此时我们写的库不在系统,而在某个目录下

所有使用-L.指明要在某个地方找,去哪里找
如果要指明非c/c++的库都需要指明 -l -L.

1.1.2使用

但zs还是觉得对于麻烦,如果需求多的话,因此可以进行文件打包,发送给他们

bash 复制代码
[lcb@hcss-ecs-1cde zs]$ tree lib
lib
├── include
│?? ├── math.h
│?? └── test.h
└── mylib
    └── libmy.a

打包

bash 复制代码
[lcb@hcss-ecs-1cde zs]$ tar czf lib.tgz lib
[lcb@hcss-ecs-1cde zs]$ ll
total 24
drwxrwxr-x 4 lcb lcb 4096 Dec 20 08:54 lib
-rw-rw-r-- 1 lcb lcb  991 Dec 20 08:55 lib.tgz

因此ls可以直接下载了,zs下载解压

bash 复制代码
drwxrwxr-x 4 lcb lcb 4096 Dec 20 08:54 lib
-rw-rw-r-- 1 lcb lcb  113 Dec 19 18:59 main.c
[lcb@hcss-ecs-1cde ls]$ tree lib
lib
├── include
│   ├── math.h
│   └── test.h
└── mylib
    └── libmy.a
相关推荐
一去不复返的通信er5 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
0+1115 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋5 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家6 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang133830890756 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻6 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
wangchunyu1147 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck7 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir7 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人8 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法