Linux下的动静态库

news2025/1/12 18:44:30

目录

认识动静态库

如何制作动静态库?

静态库 

动态库

使用库

使用静态库

使用动态库

为什么动态链接是如此呢?


认识动静态库

我们在使用标准库的时候,需要有系统的头文件和系统的库文件,这个库文件是什么呢?
当.cpp文件被编译成.o文件时,
将自己的.o文件和头文件可以直接给别人就可以使用,这个.o文件其实就类似于库文件,库文件的本质就是一系列.o文件的打包。库文件分成两种,一种是动态库,一种是静态库。

如何制作动静态库?

静态库 

比如说要把下面四个文件做成静态库:

 

用makefile一键构建

1.首先将所有的源文件.c 使用gcc的 -c选项生成 .o文件

2.使用ar -rc命令打包文件

ar其实就是一个打包软件

其选项含义:

-r(replace)是如果目标文件有更新了,就替换原来的

-c(create)是创建静态库文件

-t 列出文件

-v显示文件的详细信息

注意:静态库的库名格式是以lib开头.a结尾

3.为了方便给他人使用,将库发布,其实就是进一步整理,使用makefile一次执行多行命令,建立库目录和头文件目录,然后将.a库文件和.h头文件分别放入即可。

整体makefile就像这样,以后就能一键生成静态库了:

mylib=libmylib.a #makefile下可以定义变量var,后面用$(var)使用
$(mylib):printTime.o add.o
	ar -rc -o $(mylib) $^

cc=g++
%.o:%.cc	#%.o表示所有.o文件,%.cc表示所有.cc文件, $<和$^都表示所有的依赖目标集
	$(cc) -c $< -std=c++11 

.PHONY:clean
clean:
	rm -rf $(mylib) ./*.o ./*.a mylib

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

比如 一键生成的静态库,方便使用:

动态库

制作动态库同理,前两步略有不同。

1.将所有的源文件.c 使用gcc的 -c选项生成 .o文件,还要带上-fPIC表示产生与位置无关码的目标文件,因为静态链接是拷贝代码到调用处,具有绝对地址,而动态库是动态链接的可以理解为没有绝对地址。

2.使用gcc的 -shared选项将所有的.o文件生成.so动态库即可。


3.发布,同上

 于是整体makefile就像这样,以后就能一键生成动态库了:

mylib=libmylib.so #makefile下可以定义变量var,后面用$(var)使用
$(mylib):printTime.o add.o
	g++ -shared -o $(mylib) $^

cc=g++
%.o:%.cc	#%.o表示所有.o文件,%.cc表示所有.cc文件, $<和$^都表示所有的依赖目标集
	$(cc) -fPIC -c $< -std=c++11 

.PHONY:clean
clean:
	rm -rf $(mylib) ./*.o ./*.so mylib

.PHONY:output
output:
	mkdir -p mylib/include
	mkdir -p mylib/lib
	cp ./*.h mylib/include 
	cp ./*.so mylib/lib

 

那么如何使用动静态库呢?

使用库

比如当前文件夹下只有刚才打包好的mylib文件夹,当前的.cc文件如何使用库呢?

 

使用静态库

因为当前文件夹下只有刚才打包好的mylib文件夹,所以编译直接报错

可以在“”中放入头文件的具体路径,比如:

或者将头文件放入系统头文件/usr/include/目录下系统头文件(usr/include/)路径,(注意需要root权限)比如:

gcc编译的时候gcc就会去在系统头文件目录下去查找

 但是库文件未安装,需要将库安装到系统库文件目录/lib64/下

但是gcc还是不认识库和头文件,因为默认gcc中是没有的,

需要以下步骤:

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

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

指定链接的库文件:-l 库名(去掉lib和.a)

注意:选项与路径或库名可不加空格

也就是这样:

 于是编译就通过了,因为倘若我们的代码不成熟,拷贝进系统库中,会污染库,所以不建议拷贝入系统的库文件下,可以直接指定我们的相应的路径,也能编译通过,比如:

使用动态库

方法与使用静态库一样,同上带上三个选项-I -L -l  告诉编译器相关路径,但是生成的程序仍然不知道依赖的库,除非在.so当当前文件夹下面,使用静态库没有这个问题,因为可执行程序已经拷贝了代码,不依赖库。

所所以运行程序时就会报错加载动态库错误:

使用命令ldd就可以查看到动态链接了:

需要让进程找到动态库,主要有三种方法:

1.拷贝动态库到系统库路径下:

 2.导入环境变量,程序运行时会在环境变量中查找自己需要的动态库路径

(xshell退出环境变量会失效)  

在环境变量LD_LIBRARY_PATH中添加动态库的路径 ,比如:

 3.系统配置文件来做

在/etc/ld.so.conf.d下添加.conf文件,文件内容就是我们的动态库的绝对路径,

再使用sudo ldconfig命令让配置文件生效即可

4.其他方法:

在/lib64/下建立我们的动态库的软链接

 

如果系统库路径下有我们的软连接,编译选项只要-I 和 -l即可。

 

链接成功之后,把当前文件的软链接删掉,用ldd查看a.out的动态链接情况:

为什么动态链接是如此呢?

因为程序运行时,有一部分代码需要跳转到动态库中运行,OS将代码加载到物理内存,页表把内存共享区与物理内存建立映射,运行代码时跳转到共享区即可,其他进程也使用这个动态库的时候只要页表建立映射即可,在物理内存动态库只有一份 ,所以进程在运行时如果要加载动态库,需要先找到动态库。而使用静态库时,静态库的代码在代码区已经拷贝了一份不需要再去查找静态库代码。

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

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

相关文章

Databend 借助对象存储帮你实现降本增效

本篇文章围绕着&#xff1a; 什么是对象存储当 Databend 遇到对象存储2022 年 Databend 利用对象存储降本的案例国内优秀的对象存储产品基于对象存储创业的产品 什么是对象存储 对象存储是一种可以非结构化存储和管理数据的技术。 可以简单理解为 NoSQL 接口方式存储和访问数…

linux系统中使用QT实现多媒体的功能方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的多媒体的功能。 目录 第一&#xff1a;多媒体基本简介 第二&#xff1a;应用实例实现 第三&#xff1a;程序运行效果 第一&#xff1a;多媒体基本简介 QT的多媒体模块提供了音频&#xff0c;视频&#xff…

分布式系统-CAP 理论

在前一篇分布式系统–拜占庭将军问题(The Byzantine Generals Problem) 我们理解了共识问题的背景&#xff0c;这一节主要讨论如何解决或者理解自己系统中的共识问题&#xff0c;通过什么来分辨自己的系统需要哪一种共识。 这个理论就是 CAP 理论&#xff0c;先想下面几个问题…

linux 线程详解

前言 程序运行在内存空间中叫进程&#xff0c;进程中包含有若干线程&#xff0c;线程是系统调度和执行的基本单位。线程才是程序运行的实体&#xff0c;通常程序里的main()函数就相当于主线程&#xff0c;把进程理解成一个容器&#xff0c;里面可以包含有若干线程和若干资源&am…

6)Mybatis启动流程

1. 首先Mybatis会加载配置文件mybatis-config.xml&#xff0c; 主要实现在Mybatis的builder模块&#xff0c;包路径org.apache.ibatis.builder&#xff0c;解析入口XMLConfigBuilder private void settingsElement(Properties props) {configuration.setAutoMappingBehavior(Au…

指针进阶篇(2)

进阶指针 &#x1f914;前言&#x1f914; 一、&#x1f60a;函数指针&#x1f60a; 二、&#x1f61c;函数指针数组&#x1f61c; 三 、&#x1f61d;指向函数指针数组的指针&#x1f61d; 四、&#x1f31d;回调函数&#x1f31d; &#x1f340;小结&#x1f340; &…

摩丝-题解

看到题目&#xff0c;怀疑是莫尔斯电码&#xff0c;打开发现果然是莫尔斯电码的点和划.. .-.. --- ...- . -.-- --- ..-简单说一下电报的原理最简单的电报模型就是一个电源&#xff0c;一个开关和一个电磁铁当需要长距离使用时候&#xff0c;需要用到继电器按下开关&#xff0c…

【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

C#【必备技能篇】使用NPOI实现对excel的读取和写入

文章目录1、Winform界面布局2、引用NPOI的dll3、源码4、运行效果5、NPOI的dll下载地址6、补充【以上步骤只能打开.xls文件&#xff08;97-2003版本&#xff09;&#xff0c;打不开.xlsx文件&#xff08;2007版本&#xff09;】1、Winform界面布局 2、引用NPOI的dll 3、源码 us…

(十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置

前言 本节内容我们主要介绍一下在jenkins中如何集成sonar qube代码质量检查工具&#xff0c;sonar qube可以在流水化项目集成部署前对我们的代码质量检查。开始本节内容前我们需要先搭建好sonar qube服务&#xff0c;关于sonar qube服务的搭建可参考作者往期博客内容&#xff…

P4391 [BOI2009]Radio Transmission 无线传输

题目描述 给你一个字符串 s_1s1​&#xff0c;它是由某个字符串 s_2s2​ 不断自我连接形成的。但是字符串 s_2s2​ 是不确定的&#xff0c;现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 LL&#xff0c;表示给出字符串的长度。 第二行给出字符串 s_1s1​ 的一个子…

【linux入门】基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell&#xff08;Xshell替代品&#xff09;【第二章-Linux基础命令】1.Linux目录结构2.什么…

Linux---权限

目录 1.文件访问者的分类&#xff08;人/用户&#xff09; 2.文件类型和访问权限&#xff08;事物属性&#xff09; 3.文件权限值的表示方法 a)字符表示方法 b)8进制数值表示方法 4.文件访问权限的相关设置方法 4.1 改属性 4.2 改人&#xff08;改拥有者/所属组&#xff09;…

数组常用方法总结 (3) :map / forEach / every / some

map 遍历数组的每一项。如果是简单数组&#xff0c;不改变原始数组&#xff08;值类型&#xff09;。如果是对象数组&#xff0c;原始数组可以被改变&#xff08;引用类型&#xff09;。遍历原始数组&#xff0c;返回值为原始数组的每一项&#xff0c;最终可组合成新数组。 简…

LeetCode 78 子集 | 解题思路分享

原题链接&#xff1a;78. 子集 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;中等 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任…

忆享聚焦|5G投资、网络安全市场、云计算、Web3技术……近期热点资讯一览

“忆享聚焦”栏目第11期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1. SA&#xff1a;全球…

ubuntu虚拟机VmWare与主机共享文件夹

一、说明&#xff1a; 宿主操作系统&#xff1a;Windows 11 64位。 客户操作系统&#xff1a;Ubuntu 18.04.1 64位。 虚拟机软件&#xff1a;VMware Workstation 17 pro 二、步骤&#xff1a; 1、参考教程链接1&#xff0c;在主机设置共享文件夹。 注意&#xff1a;教程链接…

聚焦技术,2022巨杉荣获国内外多家权威机构认可

作为分布式数据库的领先企业 巨杉成立十年来&#xff0c;一直聚焦分布式技术的自研与深耕 在分布式数据库领域已取得丰硕的成果 回望2022&#xff0c;巨杉除在客户案例及产品方面屡获殊荣外 也凭借过硬的技术实力及规模化的行业应用 得到多家国内外权威机构的认可 国际权威…

TensorRT学习笔记--基本概念和推理流程

目录 前言 1--Tensor RT基本概念 2--推理流程 3--实例代码 前言 以下 Tensor RT 的基本概念和推理流程均为博主自我的理解&#xff0c;可能部分内存会存在错误或偏差&#xff0c;仅供参考&#xff01; 1--Tensor RT基本概念 ① Logger&#xff1a;日志记录器&#xff0c;…

ssm:spring定时任务Task和CronExpression表达式

开发一个定时任务&#xff1a;每天晚上23点执行数据归集任务 首先Spring配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.or…