【Linux】十分钟理解动静态库

news2024/11/25 0:31:43

目录

  • 一 前置概念
  • 二 静态库
    • 2.1
    • 2.2
    • 2.3放入指定路径
    • 2.4 第三方库的使用
  • 四 动态库
    • 3.1 环境变量
    • 3.2 软链接方案
    • 3.3 配置文件方案

一 前置概念

  1. 我们在VS2022下安装开发环境实际上就是安装编译器软件、安装要开发的语言配套的库和头文件。
  2. 我们使用编译器有语法的自动提醒功能,需要包含头文件才能用。本质:编译器或者编辑器,它会自动的将用户输入的内容,不断的在被包含的头文件中进行搜索,自动提醒功能是依赖头文件来的。
  3. 语法报错是编译器进行的自动语法检查。
  4. 静态库(.a),动态库(.so)
  5. 一般云服务器,默认只存在动态库,不存在静态库,静态库需要单独安装。

二 静态库

2.1

  • 生成 .c 文件的二进制文件,然后和源文件链接。
    在这里插入图片描述
    zcf是一个用户,他只写了一个main.c想要使用加法但是不会写,我们可以直接把add.c传到zcf那里去,但是如果我们不想直接传源文件那么就可以使用如图所示的方法。

  • 先把add.c变成二进制文件add.o,然后把add.o和add.h传到zcf中,再把main.c变成main.o将两个文件链接在一起(gcc -o)即可。

2.2

  • 生成静态库
    在这里插入图片描述
    我们先用 .o 文件生成静态库,然后进行编译,失败的原因能看到是链接错误,未能找到库
    在这里插入图片描述
    因为我们自己写的库编译器是不认识的,所以需要我们在编译时说明库的路径和名字,
    -L加库的路径,-l加库的名字(找库的时候库名字记得去掉前缀和后缀)。

2.3放入指定路径

在这里插入图片描述
先新建两个目录,Include装头文件,mylib装库文件。

sudo cp -rf Include/* /usr/include/

将头文件目录放入默认搜索路径
/usr/include/ 是头文件的默认搜索路径,Include后面要加 /*

sudo cp mylib/* /lib64

将库文件目录放入默认搜索路径
/lib64 是库文件的默认搜索路径

在这里插入图片描述
再告诉编译器库的名字,这样就可以运行了。

2.4 第三方库的使用

  1. 需要指定的头文件和库文件
  2. 如果没有默认安装到系统gcc、g++默认的搜索路径下,需要告知编译器:a.头文件在哪,b.库文件在哪c.库文件具体是谁。
  3. 将我们下载下来的库和头文件,拷贝到系统默认路径下——在Linux下安装库。(卸载就是在默认路径下删除)
  4. 如果我们安装的库是第三方的(除了语言、操作系统接口)库,我们要想正常使用,即使是已经全部安装到系统中,必须用 -l 指明具体库的名字。
  5. 安装库需要sudo命令,或者超级用户。

四 动态库

在这里插入图片描述
与静态库有所不同,动态库在形成 .o 文件时需要与位置无关码,即在gcc
后加 -fPIC

在这里插入图片描述
动态库和静态库的打包方式不同

在这里插入图片描述
我们仍然新建两个文件夹,分别放头文件和库文件,然后编译发现报错。

  • 为什么找不到呢?

虽然我们告诉了编译器库的位置但是没有告诉OS,运行的时候我们的.so没有在系统的默认路径下,所以OS依然找不到。

静态库为什么能找到? 静态库的链接原则:将用户使用的二进制代码直接拷贝到目标可执行程序中。
(动态库不会这样)

  • 如何解决?

利用下面的方法可以让OS找到动态库。

3.1 环境变量

在这里插入图片描述

我们可以把动态库的路径添加到环境变量中,这样就能找到了。
但是这只是临时方案,重新登录就环境变量就变了。

3.2 软链接方案

在这里插入图片描述

我们也可以建立软链接,在 /lib64 内放一个软链接这样就可以找到库了。

3.3 配置文件方案

在这里插入图片描述
先在配置文件目录中创建一个文件。

在这里插入图片描述
打开刚才创建的文件,把动态库的路径粘贴进去。此时还是找不到

在这里插入图片描述

需要ldconfig刷新一下,这样就能使用了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python常用库之colorama (python命令行界面打印怎么加颜色)

文章目录 python常用库之colorama (python命令行界面打印怎么加颜色)背景colorama介绍colorama使用colorama打印红色闪烁打印颜色组合 python常用库之colorama (python命令行界面打印怎么加颜色) 背景 在Python开发项目过程中,为了方便调试代码,经常会…

Java中Map中10w条数据用什么循环性能最好呢?

加油,新时代打工人! 1、java中List集合三种获取集合元素方式 2、Java中Map使用增强for循环和迭代器获取key和value 选择合适的循环方式,让性能最优! public class Test2 {public static void main(String[] args) {//初始化 10w…

vue upload 上传下载

目录 上传 下载 对象/文件流 download处理返回 文件流 axios.post 封装axios 1.请求设置类型responseType: blob 2.若有请求拦截(直接返回即可) 3.download 4.请求下载 相关基础 blob MIME vue 实现文件上传、下载的方法 - 掘金 上传 submitAddFile(){var form…

基础算法-【离散化】

离散化的本质:是建立了一段数列到自然数之间的映射关系(value -> index),通过建立新索引,来缩小目标区间,使得可以进行一系列连续数组可以进行的操作比如二分,前缀和等… 相应的算法模板: v…

【Linux】—— 进程地址空间

序言: 在上篇中,我们讲解了关于进程优先级的概念。本期,我将给大家介绍的是关于进程地址空间的话题。 目录 (一)程序地址空间回顾 (二)代码演示 (三)进程地址空间的引…

【力扣算法08】之 5. 最长回文子串 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析 运行效果截图调用示例运行结果 完结 问题描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例1 输入:s…

【网络编程】Linux服务器程序规范相关内容

文章目录 1、日志1.1、syslog()函数 2、用户信息2.1、UID、EUID、GID、EGID 3、进程间关系3.1、进程组3.2、会话 4、服务器程序后台化(守护进程) 1、日志 Linux提供一个守护进程rsyslogd来处理系统日志,系统日志中包括用户进程产生的日志以及…

VUE2基础-Vue实例

Vue 实例 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm new Vue({// 选项 }) 虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名…

交换:交换机相关技术(二层技术)

目录 VLAN:虚拟局域网 VLAN种类: 接口分配链路类型 接口划分VLAN 跨网段的通讯 VLAN:虚拟局域网 LAN :局域网 MAN:城域网 WAN:广域网 1.一个VLAN相当于一个广播域 VLAN:通过路由器和交换机…

PADS Logic如何对原理图页面进行操作呢?

在绘制复杂的原理图时,会根据功能模块来将原理图进行分页处理,在绘制原理图过程中,会对原理图页面进行一些处理,操作方法如下所列: 1、页面拷贝与粘贴:在原理图中选中需要复制的元件走线等,左击…

Git常用命令及在Idea中如何使用创建分支等,详讲带图[保姆级]

文章目录 Git在Git命令行中执行下面命令:设置基本信息获取Git仓库Git 工作区 暂存区 版本库概念工作状态远程仓库操作分支操作标签分类 Idea中使用推送到远程仓库(提交并且推送)分支操作 Git 在Git命令行中执行下面命令: 设置基本信息 设置用户信息 git config --global use…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了,完整版开放下载

“微服务架构经验你有吗?” 前段时间一个朋友去面试,阿里面试官一句话问倒了他。实际上,不在BAT这样的大厂工作,是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得,让各个大厂都抢着要这样的人才&#x…

Bash 第十行

195 第十行 给定一个文本文件 file.txt,请只打印这个文件中的第十行。 示例: 假设 file.txt 有如下内容: Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 你的脚本应当显示第十行: Line 10 来源:…

NITIRE 2023官方的PSNR及SSIM计算代码

NITIRE 2023官方的PSNR及SSIM计算代码 问题描述 做图像复原任务时,总避免不了计算PSNR和SSIM等图像质量评估指标,但是网上实在是太多计算这类指标的代码了,不同代码计算的结果还可能存在差异。有使用matlab计算SSIM的,也有使用py…

7月23作业

2.作业 platform驱动实现 platform.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/slab.h> #include <linux/io.h> #include&l…

CDN技术(Content Delivery Network,内容分发网络)分布式网络架构(CND与P2P(Peer-to-Peer)区别)

文章目录 CDN是什么&#xff1f;CDN的优势CDN的应用1. 静态内容加速2. 动态内容加速3. 视频流媒体4. 软件分发5. 游戏加速6. 移动应用加速 CDN收费吗&#xff1f;CND与P2P区别什么是静态内容和动态内容&#xff1f; CDN是什么&#xff1f; CDN&#xff08;Content Delivery Ne…

七大排序算法——直接选择排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、直接选择排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递…

基于linux下的高并发服务器开发(第一章)- Makefile(1)1.10

01 / 什么是Makefile 02 / Makefile文件命名和规则 &#xff08;1&#xff09;在~/Linux/lesson7目录下,vim Makefile &#xff08;2&#xff09;ll查看当前目录下的文件信息 &#xff08;3&#xff09;编辑以下内容,然后保存并退出 app:sub.c add.c mult.c div.c main.c gcc…

熊猫代阅脚本-沉睡者IT技术分享

熊猫代阅脚本-我的编程技术之路 熊猫阅读app是一款酷炫的阅读应用带来了多样化的阅读模式&#xff0c;熊猫阅读app专注网络小说阅读&#xff0c;更新快&#xff0c;让大家获得最好的小说阅读体验&#xff0c;有需要的快来下载。 熊猫阅读app亮点 阅读赚钱&#xff1a;越读越…

DAY46:动态规划(七)01背包应用:分割等和子集+最后一块石头重量Ⅱ+目标和

文章目录 416.分割等和子集&#xff08;回溯01背包&#xff09;思路回溯解法&#xff08;类似组合总和Ⅱ&#xff09;回溯解法存在的问题 01背包思路为什么能抽象成背包问题 01背包写法1&#xff1a;常规写法&#xff0c;考虑重量价值重量价值类问题的思考方式DP数组含义递推公…