2024年运维最新【Linux】基础IO —— 下(实现动静态库


`my_sub.h`



#pragma once
#include<stdio.h>

int my_sub(int a,int b);


`my_sub.c`



#include"my_sub.h"

int my_sub(int a,int b)
{
return a-b;
}


**下面我们来将这四个文件进行打包然后生成一个静态库**


* 第一步


**将所有的源文件变成对应的.o目标文件**


![在这里插入图片描述](https://img-blog.csdnimg.cn/3369871206bd47d1a08b6ca4e920b3c0.png)




---


* 第二步


**使用ar命令将所有的目标文件打包生成静态库**


![在这里插入图片描述](https://img-blog.csdnimg.cn/6ad11a6e3f984ca8aabc9a5dd587f4c9.png)


**注意:**


ar命令是gnu的归档工具,它常用于将目标文件打包为静态库,ar命令中的-r选项与-c选项分别代表的是repalce和creat。


* -r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件。
* -c(creat):建立静态库文件。
* -t:列出静态库重点文件
* -v(verbose):详细信息




---


* 第三步


**将生成的静态库文件与目标文件对应的头文件组织起来**


当我们将我们自己的库给别人使用的时候,我们需要创建两个目录,一个用来存放所有的头文件,一个用来存放静态库文件。


因此,我们将myadd.h与mysub.h这两个头文件放到include这个目录下。将静态库文件放到lib这个目录下。然后将这两个目录都放到mylib这个目录下,此时我们若是向把我们自己的库给别人使用,我们只需要将mylib这个文件发给别人就可以了。


![在这里插入图片描述](https://img-blog.csdnimg.cn/ee2df666593a49f582cd34c3302e04b8.png)


**注意:**


Mac下没有tree命令,而window下是有的,需要下载



sudo yum -y install tree




---


### ❄️ 2.2 静态库的使用


静态库生成好了之后,我们就来尝试着使用以下这个静态库吧。


我们首先创建一个test.c文件,然后写一段简单的代码用一下加法函数


`text.c`



#include"my_add.h"
int main()
{
int x = 10;
int y = 20;
printf(“add: %d\n”,my_add(x,y));
return 0;
}


`Makefile`



text:text.c
gcc -o $@ $^ -static

.PHONY:clean
clean:
rm -f text


* 方法一


**使用gcc选项**


![在这里插入图片描述](https://img-blog.csdnimg.cn/e6a7c93dc10c47328ce80af82ef3de08.png)我们发现居然出错了,我们打包好的静态库和头文件不就在当前目录下嘛,为什么它这里却又说找不到呢?


**这是因为编译器它并不知道你所包含的my\_add.h头文件在哪里,所以我们需要指定头文件的搜索路径。**


因此我们需要在makefile里面的gcc后面带一个选项就可以指定头文件的搜索路径了



> 
> **-I:指定头文件的搜索路径**
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/93c70afff955452facdae988789b3bef.png)


修改完之后我们重新make一下


![在这里插入图片描述](https://img-blog.csdnimg.cn/06d54cb7381448c5a576c4aa62809f10.png)


我们发现又出错误了


这是因为你只是告诉了编译器库文件的搜索路径在哪里,但是你并没有告诉你要去链接哪一个库,假如说这个库文件里面有很多个库,那编译器它又怎么知道你想要去链接哪个库呢。


**这是因为头文件my\_add.h里面只有加法函数的声明,并没有函数的定义,因此我们还需要指定库文件的搜索路径。**


因此我们只需要在makefile里面的gcc后面带一个选项就可以指定库文件的搜索路径了



> 
> **-L:指定库文件搜索路径**
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/e733863e27684d738a00110401c28414.png)


我们接着再来make一下


![在这里插入图片描述](https://img-blog.csdnimg.cn/f8c3f89d8ca74df4970b0dfbf2f80b09.png)


我们发现又出错误了


这是因为你只是告诉了编译器库文件的搜索路径在哪里,但是你并没有告诉你要去链接哪一个库,假如说这个库文件里面有很多个库,那编译器它又怎么知道你想要去链接哪个库呢?


所以我们还需要指定一下我们需要链接库文件中的哪一个库。


因此我们需要在makefile里面的gcc后面再带一个选项去指明我们想要链接库文件中的哪一个库。



> 
> **l:指明想要链接库文件中的哪一个库**
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/32687cd986b1481184bae594f63f0f4e.png)


我们再来make一下看看结果


![在这里插入图片描述](https://img-blog.csdnimg.cn/ed92465077d74aeb8e40a9e05731958b.png)  
 最终我们得到了我们想要的运行结果。


**注意:** 所有的库和头文件只有在当前路径下能够被直接找到,如果当前路径下还包了目录,那么你就需要指明你的搜索路径才行。


* 方法二


将头文件和库文件放到系统路径下


如果我们不指定搜索路径的话,编译器它就找不到我们的头文件和库文件,除了上面指定搜索路径的法子我们还可以将我们的头文件和库文件放到系统路径下,这样的话编译器就能够找到了。


尽管使用这种方式我们不需要指定头文件的搜索路径和库文件的搜索路径,但是我们还是要告诉编译器我们链接库文件的哪个库。


虽然说这种方法相较于第一种方法而言会简单一点,但是我不建议你使用这种方法,原因有两个:


* 将我们的头文件和库文件放到系统路径下,这样做有可能会对系统文件造成污染
* 使用第一种方法可以帮你熟悉gcc命令,同时使用第一种方法虽然麻烦但是不会对系统文件造成污染。




---


## ⛄️3. 动态库的使用与打包


### ❄️ 3.1 动态库的打包


我们上面学了静态库的打包和使用之后,接下来我们再来学习动态库的打包和使用就会容易很多了。因此动静态库的打包基本类似。下面我们继续使用这四个文件来给大家展示动态库的打包和使用


![在这里插入图片描述](https://img-blog.csdnimg.cn/bd32b5ff5e92457889951295ed7c5306.png)


* 第一步


让所有的源文件生成对应的.o目标文件



> 
> **fPIC 产生位置无关码(position independent code)**
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/15c8d74bf58a4fd49593d40f7c82c9d3.png)




---


* 第二步


将目标文件打包生成动态库


![在这里插入图片描述](https://img-blog.csdnimg.cn/15c8d74bf58a4fd49593d40f7c82c9d3.png)


然后我们来make一下生成对应的目标文件和动态库:


![在这里插入图片描述](https://img-blog.csdnimg.cn/a36807f170a34d729329d1437d1988a1.png)




---


* 第三步


将头文件和我们生成的动态库组织起来


这里我们换一种方式来将它们两个组织起来,我们在Makefile里面编写一段代码,通过 发布 然后将他们给组织起来。


![在这里插入图片描述](https://img-blog.csdnimg.cn/df3928e8bea84e4dbc28b54853c830eb.png)


下面我们来make output一下,通过发布将头文件和动态库给组织起来:


![在这里插入图片描述](https://img-blog.csdnimg.cn/6e5287e762044c1fa08c7af97826eefe.png)


此时我们的动态库和头文件就已经打包完毕了,如果后面别人想要用我们的这个库,我们只需要把mylib这个文件给别人就可以了。




---


### ❄️ 3.2 动态库的使用


上面我们的动态库打包好之后,我们就来使用一下我们打包好的动态库吧,下面我们依然使用test.c文件来为大家演示动态库的使用


`text.c`



#include"my_add.h"
#include"my_sub.h"

int main()
{
int a = 20;
int b = 10;
printf(“add: %d\n”,myadd(a,b));
printf(“sub: %d\n”,mysub(a,b));

return 0;

}


`Makefile:`



test:text.c
gcc -o $@ $^ -I./mylib/include -L./mylib/lib -lmy_math

.PHONY:clean
clean:
rm -f test


![请添加图片描述](https://img-blog.csdnimg.cn/112aab7957f7414fa0d9a2fc5f7e6698.png)  
 可以看到我们这里执行可执行程序的时候出错了,这个时候我就比较好奇了:我明明已经指定头文件的搜索路径,指定库文件的搜索路径,以及我们要链接库文件中的哪一个,为什么我们这里还是会报错呢?


这是因为你只是告诉了编译器,你并没有告诉操作系统。不要忘了链接动态库的时候是在程序运行的时候链接的。


可以看到当我们用ldd命令查看test可执行程序的时候,发现找不到这个动态库


![请添加图片描述](https://img-blog.csdnimg.cn/89e2c1bc2ef04fcf96e1045b93813148.png)


**那么问题又来了:我们应该如何解决呢?**


* 方法一


与静态库使用的第二种方法类似,我们将动态库拷到系统路径下。


* 方法二


**更改LD\_LIBRARY\_PATH**


为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/8a1c1bd5517a3ae517fd96f3e551e494.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值