Linux学习之制作静态库和动态库

写在前面:

我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久,结果因为不会安装VMware就无疾而终了,可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假(那个时候刚刚过完考试周),我没什么事做就又重拾Linux,不服输的我选择再战Linux,这一次学习还算顺利,虽然中间有些小插曲但是不影响整体学习进度, 我看着B站上的视频一点点学习Linux,基本上把Linux的基础指令学完了。学完之后我又遇到问题了,视频基本上到这就结束了,而我却不知道下一步该学什么,于是就没怎么碰Linux,结果没过多长时间我就把学的Linux指令忘的一干二净。现在是我第三次学习Linux,我决定重新开始学Linux,同时为了让自己学习的效果更好,我选择以写blog的形式逼迫自己每天把学习到的Linux知识整理下来。这也就是我写这个系列blog的原因。

动态库和静态库的理论对比

  • 静态库在文件中静态展开,所以有但多少文件就展开多少次,非常吃内存,100M的文件展开一百次就是1G。但是这样的好处是静态加载的速度快
  • 动态库使用时,会讲动态库加载到内存,10个文件也只需要加载一次,然后将这些文件用到库时候临时去加载,速度慢一些但是很省内存
    总述

静态库的制作

  1. 写好源代码。下面我以写一个可以四则运算的静态库的为例)
    源码

  1. 编译源代码生成 .o文件。
    编译生成

可能有些童鞋没学过编译的四个过程,下面我来介绍一下

  1. 预处理: 展开宏,头文件,替换编译条件,删除注释,空行,空白。
  2. 编译: 检查语法规范。
  3. 汇编: 将汇编指令翻译成机器指令。
  4. 链接: 数据段合并,地址回填。

gcc


关于gcc常用的编译参数

  • -I:指定头文件所在目录位置。
  • -c:只做预处理,编译,汇编。得到二进制文件。
  • -g:编译时添加调试文件,用于 gdb 调试。
  • -Wall:显示所有警告信息。
  • -D:向程序中“动态”注册宏定义
  • -L:指定动态库路径。
  • -l:指定动态库库名。

  1. 制作静态库
    命令:ar rcs lib库名.a file1.o file2.o ...
    3

  1. 制作头文件
    如果我们直接使用静态库gcc test.c lib库名.a -o a.out,就会有以下警告。
    4
    为了防止出现以上警告,我们就要做一个头文件来包含函数声明(当然你也可以直接在test中声明,但这体现我们的水平😁)
    5

左边的 define 为头文件守卫,防止在代码中多次 include 头文件,多次展开静态库,带来的额外开销

接下来我们再来编译,这样就不会就有警告报错了。
6

最后-I ...是写头文件的地址


动态库的制作

  1. 编写源代码
    1

  1. 生成位置无关的.o 文件
    命令:gcc -c add.c -o add.o -fPIC

使用这个参数-fPIC过后,生成的函数就和位置无关,挂上@plt 标识,等待动态绑定
2


  1. 使用制作动态库
    命令:gcc -shared -o lib库名.so file1.o file2.o ....
    1

  1. 编译程序
    命令:gcc test,c -o test -l 库名 -L 路径 -I 头文件的位置

  1. 执行文件,然后出错😂。
    2

  1. 出错原因及解决方法
  • 出错原因分析:
    • 连接器:工作于链接阶段,工作时需要 -l 和 -L
    • 工作于程序运行阶段,工作时需要提供动态库所在目录位置
  • 解决方法:
    1. 通过环境变量指定动态库所在位置:export LD_LIBRARY_PATH=动态库路径。但是这个方法有个弊端,当关闭终端,再次执行a.out 时,又报错。这是因为,环境变量是进程的概念,关闭终端之后再打开,是两个进程,环境变量发生了变化。
      3
    2. 写入终端配置文件。 步骤如下:
      • vi ~/.bashrc
      • 写入 export LD_LIBRARY_PATH=动态库路径
      • . .bashrc/ source 或者.bashrc / 或者重启 终端 —> 让修改后的.bashrc 生效
      • ./a.out 成功!!!
    3. 配置文件法。步骤如下:
      • sudo vi /etc/ld.so.conf
      • 写入 动态库绝对路径 保存
      • sudo ldconfig -v 使配置文件生效。
      • ./a.out 成功!!!— 使用ldd a.out查看

写在最后

个人亲身经验:我们学习的一系列Linux命令,一定要自己亲手去敲。不要只是看别人敲代码,不要只是停留在眼睛看,脑袋以为自己懂了,等你实际上手去敲会发现许许多多的这样那样的问题。正可谓“键盘敲烂,月薪过万


如果你觉得我写题解还不错的,请各位王子公主移步到我的其他题解看看

  1. 数据结构与算法部分(还在更新中):
  • C++ STL总结 - 基于算法竞赛(强力推荐
  • 动态规划——01背包问题
  • 动态规划——完全背包问题
  • 动态规划——多重背包问题
  • 动态规划——分组背包问题
  • 动态规划——最长上升子序列(LIS)
  • 二叉树的中序遍历(三种方法)
  • 最长回文子串
  • 最短路算法——Dijkstra(C++实现)
  • 最短路算法———Bellman_Ford算法(C++实现)
  • 最短路算法———SPFA算法(C++实现)
  • 最小生成树算法———prim算法(C++实现)
  • 最小生成树算法———Kruskal算法(C++实现)
  • 染色法判断二分图(C++实现)
  1. Linux部分(还在更新中):
  • Linux学习之初识Linux
  • Linux学习之命令行基础操作
  • Linux学习之基础命令(适合小白)
  • Linux学习之权限管理和用户管理

✨🎉总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
在这里插入图片描述
如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python武器库开发-武器库篇之Git创建远程仓库和建立SSH key 免密登陆(三十七)

武器库篇之Git创建远程仓库和建立SSH key 免密登陆(三十七) Git是一种版本控制系统,用于跟踪文件的更改和协调多人开发项目。它可以记录文件的历史更改,协助多人协作开发,并提供分支管理功能。Git是一个分布式系统,意味着每个人在…

目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段,如果我们想让预测值无限接近于真实值,就需要将损失值降到最低…

Centos如何修改ssh端口

想必很大一部分的同学用的是centos服务器,对于默认的22端口存在一定的安全风险,所以今天我们一起看下如何修改ssh端口 一、什么是SSH SSH(Secure Shell)是一种安全的远程登录协议,它允许您通过网络远程连接到Linux系统…

关于Redis面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv Redis 是什么 全名:远程字典服务。这是一个开源的在内存中的数据结构存…

3 个月前被裁员了,心情跌落谷底,直到我看到了这本神书…

3个月前的某一天,正在愉快的打工,突然被喊去谈话,然后就被辞退了。。 加入了找工作的大军 然而,因为疫情,因为大专学历的我,找工作比以往都艰难了许多 很多,纯粹就是因为学历,都不…

Vue3-26-路由-useRouter 和 useRoute 两个API 的作用介绍

先来说说两个API 的作用 useRouter() : 返回的是项目中的 路由实例的对象 可以通过这个实例对象进行路由的逻辑跳转 useRoute() : 返回的是当前的 路由对象, 可以在当前路由对象中获取到路由名称、路由参数、路由路径等玩完整的路由信息。 写个案例看一下具体是什么…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

Illustrator脚本 #015 自动角线

这是一个在画板上自动生成辅助线和角线的脚本,只要单击最右边按钮运行脚本即可。 绿色的为参考线及出血线。 #target "Illustrator" var settings = {addTrim : true,addBleedGuide : true,addCenterGuide : true,addCover : false,overlapAlert : false,trimma…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们,我是拾荒君。 国漫《从红月开始》第3集超前爆料,本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司,一个主要由亡命之徒组成的组织。他们表面上从事运输业务,但背地里进行偷渡和走私活动。 …

SEO中的实体:它们是什么以及为什么它们很重要?

从了解搜索历史到区分实体与关键字,真正了解实体是什么,以便获得更有针对性的搜索流量。 关于SEO专业人士应该如何理解,更重要的是,如何利用SEO中的“实体”,存在很多困惑。 我明白这是从哪里来的,尤其是…

在用Vite开发时静态图片放哪里,才能保证显示,不出现找不到资源

在用Vite开发时静态图片放哪里 在用Vite开发时静态图片(资源)放哪里呢 ? 如果你想直接全部显示的那么请你把静态资源放到public目录下面,这样你一打包所有的静态资源都会放到打包根目录下。但是此时你在项目中引用的地址一定要是…

NLP论文阅读记录 - 02 | 2022 自动文本摘要方法:综合回顾

文章目录 前言0、论文摘要一、Introduction1.1文本摘要的要求1.2主要研究贡献 二.ATS的分类2.1基于没有。输入文档的数量2.2 基于总结方法2.3 基于输出摘要性质:2.4 基于摘要语言2.4.1 基于摘要算法2.5 基于摘要内容2.6 基于摘要类型2.7 基于概括域2.8 基于加工水平…