Linux动静态库

文章目录

  • 静态库
    • 制作静态库并发布
    • 如何使用第三方静态库
      • 方式一
      • 方式二:
      • 方式三
  • 动态库
    • 制作动态库并发布
    • 链接动态库
      • 方式一
      • 方式二
      • 方式三
      • 方式四
    • 生成共享库参数
  • 动静态库总结

静态库

程序在编译链接的时候,直接将该库拷贝一份到源文件,运行的时候不再需要该静态库。
静态库的命名方式:以lib为前缀,以.a为后缀。

制作静态库并发布

1.把函数声明都放在一个或多个.h的头文件里
2.把.h中的声明的函数实现放在.c文件里
3.把这些.c文件生成.o文件
4.把生成的多个.o文件打包放到.a文件里(其实.o文件就可以直接与我们的源文件进行链接形成可执行程序了,但为了方便使用,我们把多个.o文件打包放到了.a文件里)
生成的库名称
声明生成的库名字为libmymath.a

#形成的库名字叫做libmymath.a
lib=libmymath.a

将.c文件生成.o文件

# gcc命令只加$^ 默认把.c文件形成与$@同名的.o文件
div.o add.o:div.c add.c
	gcc -c $^

在这里插入图片描述
将.o文件打包放到静态库.a文件里

#ar是生成静态库的命令 生成的库依赖的是.o文件
$(lib):div.o add.o
	ar -rc $@ $^

ar命令是打包命令,意为将$ ^文件都放到$ @文件里,
这里的$ ^文件为div.o和add.o,$@文件为库文件libmymath.a
在这里插入图片描述
发布
就是创建一个目录,用来存放头文件目录include和库文件目录,分别用来放头文件.h和库文件.a(.a文件里放的是.o文件集合)

.PHONY:output
output:
	mkdir -p lib/include
	mkdir -p lib/mymathlib
	cp *.h lib/include
	cp *.a lib/mymathlib

在这里插入图片描述
清除

.PHONY:clean
clean:
	rm -rf *.a *.o lib

静态库可不可以不包含头文件呢?
不可以,因为头文件是这个库文件所提供的方法的说明书,你不提供,使用者就不知道这个文件里有哪些方法,怎么去调用
lib目录里面放的是库的集合
Makefile文件

#形成的库名字叫做libmymath.a
lib=libmymath.a

#ar是生成静态库的命令 生成的库依赖的是.o文件
$(lib):add.o div.o 
	ar -rc $@ $^

# gcc命令只加$^ 默认把.c文件形成与$@同名的.o文件
div.o add.o:div.c add.c
	gcc -c $^

.PHONY:clean
clean:
	rm -rf *.a *.o lib

.PHONY:output
output:
	mkdir -p lib/include
	mkdir -p lib/mymathlib
	cp *.h lib/include
	cp *.a lib/mymathlib

通过为 gcc 指令添加 -c 选项(注意是小写字母 c),即可让 GCC 编译器将指定文件加工至汇编阶段,并生成相应的目标.o文件

如何使用第三方静态库

方式一

直接将已发布的第三方静态库拷贝到当前目录下
在这里插入图片描述
在这里插入图片描述

1.先把库集合lib目录文件拷贝到当前目录下,不拷贝也行只要你能找到
2.生成可执行程序
生成可执行程序要指明要链接的库的路径和头文件,
大I选项:用于指明头文件路径

-I ./lib/include/

大L选项:用于指明要链接的库,需要在哪个路径下去搜索

-L ./lib/mymathlib/

小l选项:用于指明要链接哪一个库
这里的库名是libmymath.a,但库的真实名字是去掉前缀去掉后缀,留下来的才是真实的名字
一般建议小l后面紧跟真实的名字

-lmymath

1.为什么头文件指明搜索路径就可以了?不需要再指明具体是哪一个.h头文件呢?
因为在.c源文件中我们已经指明了要包含哪一个头文件,例如这里的#include “add.h”
2.源文件默认只会在当前路径下进行搜索或者默认的库路径下去搜索,当前路径是指在同一级别,main.c和lib是在同一目录下,但是和lib下的文件,就不属于同一目录级别的了,系统默认不会去搜索,因此需要我们手动的带选项去指明要去搜索的路径,且要指明要链接该路径下的哪一个文件。
在这里插入图片描述
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行

方式二:

将第三方库拷贝到默认库路径下
头文件:
拷贝到系统库文件/usr/include/下
在这里插入图片描述
库文件:
拷贝到系统文件/lib64/路径下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意即使拷贝到系统默认路径下了,也要指明要链接的库名称

方式三

建立软链接,链接到系统路径下
这里要求把路径带全

在这里插入图片描述
在这里插入图片描述
在生成可执行程序时,要指明要链接的库的名称

动态库

制作动态库并发布

动态库的生成和发布与静态库,基本没有什么相同
不同的是:
1.动态库我们也以lib开头但以.so为后缀,与静态库进行区分。
2.生成的库为共享库
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
3.编译阶段使用动态库
编译选项
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
库名为libmymethod.so
生成可执行程序示例: gcc main.c –L… -I… -lmethod
4.链接动态库方式有所不同
1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib64
2.在系统默认的库路径下建立软链接 /usr/lib64
3、将自己的库所在的路径,添加到系统的环境变量 LD_LIBRARY_PATH中
4、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

链接动态库

方式一

拷贝.so文件到系统共享库路径下, 一般指/usr/lib64

在这里插入图片描述
在这里插入图片描述

方式二

在系统默认的库路径下建立软链接 /usr/lib64

方式三

在这里插入图片描述

将自己的库所在的路径,添加到系统的环境变量 LD_LIBRARY_PATH中
在这里插入图片描述

在这里插入图片描述

方式四

/etc/ld.so.conf.d/下建立自己的动态库路径的配置文件,然后重新ldconfig(这是更新配置文件命令)即可
在这里插入图片描述

生成共享库参数

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
我们来了解一下产生位置无关码的fPIC是什么

动静态库总结

动静态库其实在使用上基本类似,不同点是
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用docker部署nacos分布式集群

本文目的 在服务器中部署nacos集群,并连接外置数据库关于外置的mysql部署和单例nacos如何部署请看下面的两个链接 如何使用docker部署mysql docker部署容器化mysql5.7-CSDN博客 如何使用docker部署nacos 容器化部署Nacos:从环境准备到启动-CSDN博客…

互联网医院系统:数字化时代中医疗服务的未来

随着数字化时代的发展,互联网医院系统在医疗服务中的作用日益凸显。本文将讨论互联网医院系统的一些关键技术方面,探讨这些技术如何推动医疗服务进入数字化时代。 1. 数据智能与个性化服务 互联网医院系统依赖于大数据分析和人工智能技术,…

android studio导入eclipse项目

网上下载一个老工程,.project文件里有eclipse。 android studio导入eclipse项目 eclipse项目结构 Android studio文件结构 下面是导入步骤: 第一步,打开一个项目。 选择File->New->Import Project 第二步,选择Eclipse项目根…

【LeetCode】每日一题 2023_11_16 最长奇偶子数组(枚举,模拟)

文章目录 刷题前唠嗑K 个元素的最大和题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode? 启动!!! 今天早上概率论期中,被爆杀完之后,下午数电,今天很疲惫很疲惫,一直拖到了现在,终…

70基于matlab的BP神经网络多输入单输出数据结果预测,输出结果包括均方根误差,决定系数

基于matlab的BP神经网络多输入单输出数据结果预测,输出结果包括均方根误差,决定系数。数据可更换自己的,程序已调通,可直接运行。 70 BP神经网络,时间序列预测 (xiaohongshu.com)https://www.xiaohongshu.com/explore/…

esp8266-01固件信息

除了NodeMCU固件,ESP8266芯片还可以使用其他固件,例如官方提供的Espressif Systems的AT固件,或者第三方开发者基于ESP8266芯片开发的其他固件。这些固件提供了不同的功能和编程接口,以满足不同的开发需求。 固件与底层硬件打交道…

11.11作业题

1.不死兔子 def fib(n):if n < 4:return 1else:return fib(n-1) fib(n-2) print("一年后共繁殖{}对兔子".format(fib(12))) 2.输入字符串&#xff0c;判断该字符串是否是回文字符串 s input("请输入一个字符串&#xff1a;") if not s:print("…

TVM编译入门概念 一

最近阅读到陈天奇的一篇文章&#xff0c;链接分享 21年底&#xff0c;他说在三年前也就是2018年左右就完成了基于多层优化的解决方案。 当把全栈解决方案搭建起来并且不断实践之后发现有两种隔阂阻碍整个行业的发展。做一些总结。 本文合适的受众是ai编译器相关的入门级选手或供…

巴菲特再度出手,清仓7家公司股票

KlipC报道&#xff1a;最新数据显示&#xff0c;伯克希尔第三季度总共清仓了7家公司的股份&#xff0c;其中包括动视暴雪、通用汽车、化工巨头塞拉尼斯、亿滋国际、强生、宝洁和联合包裹。 KlipC的合伙人Andi D表示&#xff1a;“此前最新的监管文件显示&#xff0c;伯克希尔哈…

Servlet---从创建项目到部署项目的整个流程

文章目录 创建项目引入Servlet依赖创建目录结构编写代码打包程序部署程序验证程序 创建项目 引入Servlet依赖 为什么需要引入依赖资源呢&#xff1f; Servlet不是标准库自带的&#xff0c;需要从外部引入进来才能使用。如何引入&#xff1f; 利用maven&#xff0c;maven的一个…

泛娱乐社交掀起2万亿市场热潮,Flat Ads独家流量助出海获客

作为产品/服务的提供方&#xff0c;中国企业在几乎所有海外市场&#xff0c;都算是强有力的参与者&#xff0c;在社交泛娱乐领域表现尤为突出。但不同于游戏、电商、工具等其他品类&#xff0c;我们几乎很难对社交泛娱乐下一个精准的的定义。因为随着技术进步、行业发展&#x…

机器视觉双目测宽仪 高温钢板实时无滞后检测

高温钢板在生产中的宽度尺寸检测有很多种方法&#xff0c;本来来介绍一下双目测宽仪&#xff0c;它同样能做到实时检测、超差提示、数据分析、信息存储等功能。 双目测宽仪采用两个工业相机从不同的角度对被测物同时进行测量&#xff0c;两个工业相机就像人的双眼&#xff0c;可…

Python接口自动化(什么是接口、接口优势、类型)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一下…

appium自动化测试完整项目

前言 Appium是一个开源的自动化测试框架&#xff0c;支持跨平台&#xff0c;支持多种编程语言&#xff0c;可用于原生&#xff0c;混合和移动web应用程序&#xff0c;使用webdriver驱动ios&#xff0c;android应用程序、那么为了学习app自动化测试首要任务肯定就是搭建测试开发…

中小企业数字化的“下半场”,与华为的生态伙伴“引力场”

作者 | 曾响铃 文 | 响铃说 中小企业数字化始终是业界关注的重点&#xff0c;也催生了庞大的产业数字化价值空间等待挖掘&#xff0c;在如何推进这件事上&#xff0c;各方都在持续发力。 这其中&#xff0c;针对中小企业迫切需求&#xff0c;来自华为的动作正变得越来越紧凑…

echarts点击事件、柱状图设置区间颜色

实现echarts柱状图标记区域&#xff0c;并在单击柱状条时触发点击事件切换标记区域 //html <div id"main" style"width: 600px;height:400px;"></div>//js let _chart null; letselectInfo {};//选择的柱状条信息&#xff0c;可用于信息的获…

linux下安装python3.8(有坑)

1安装包下载 ###直接官网下载linux版本&#xff0c;找到对应的包 https://www.python.org/downloads/source/2安装包解压 tar -zxvf Python-3.8.0.tgz 3编译安装 1&#xff09;设置安装目录&#xff0c;比如在此创建在 /usr/local/python3 &#xff1a; mkdir -p /usr/loca…

解决计算机丢失msvcr71.dll问题,总结5种解决方法分享

由于各种原因&#xff0c;计算机在使用的过程中可能会出现一些问题&#xff0c;其中之一就是丢失msvcr71.dll文件。这个问题可能会导致计算机无法正常运行某些程序或功能&#xff0c;给我们的生活和工作带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何解决…

ROS 学习应用篇(七)ROS中的坐标变换管理之tf初探

坐标变化是机器人中很重要的内容&#xff0c;但是要是概括下来无非就是旋转和平移矩阵。 小海龟跟随实验 做的是两个小海龟之间的跟随&#xff0c;其实就相当于视觉设备和本体设备见有一定的位置差在ros平台下tf坐标变化的实验 首先安装海龟tf变换包 新开终端输入 sudo apt…