从零开始学习Linux(10)----动静态库

目录

1.制作静态库

1.编写源代码

2.编译

3.打包库

4.使用库

2.制作动态库

1.编译

2.打包库

3.总结

3.理解动态库加载

1.站在系统角度理解

2.谈谈编址,可执行程序


1.制作静态库

1.编写源代码

假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应的头文件。

2.编译

gcc -c mymath.c
gcc -c myprintf.c

将源文件编译为.o文件 。

3.打包库

ar -rc libmyc.a mymath.o myprintf.o

使用ar命令将两个.o文件打包为静态库,名称为去掉lib前缀和.a后缀的myc。

4.使用库

gcc main.c -lmyc -L .

如果你要在main.c中使用你的库,-lmyc指定你想要使用的库,-L .指定在当前目录下寻找库。

此时就可以运行你的main.c程序了!

2.制作动态库

1.编译

gcc -c -fPIC mymath.c
gcc -c -fPIC myprintf.c

fPIC为产生位置无关码

2.打包库

        shared:表示生成共享库格式

gcc -o main.c -I ./mylib/include

-I选项为可以在它指定的路径下搜索头文件

        静态库只要编译成功,动态库还需要运行成功,将库安装到系统中,既可以支持编译,又可以支持运行,有以下几种方法可以安装。

1.直接将库拷贝到系统中。

2.$LD_LIBRARY_PATH,该环境变量是系统运行程序时,动态库查找的辅助路径,将不再系统默认库搜索路径下的库路径,添加到LD_LIBRARY_PATH中。

3.通过软链接方式。

3.总结

        如果我们同时提供动态库和静态库,gcc默认使用的是动态库,如果我们非要静态连接,我们必须使用static选项,如果我们只提供静态库,那我们的可执行程序只能对该库进行静态连接,但是程序不一定整体是静态连接的,如果我们只提供动态库,默认只能动态连接,非得静态连接,会发生连接报错。

3.理解动态库加载

1.站在系统角度理解

        库函数的调用,依旧是在进程的地址空间中进行的,动态库加载之后,会被映射到进程的共享区中,谁来决定,那些库加载了,哪些库没加载:OS会自动完成。系统中可不可以同时存在非常多的已经加载的库呢?是,操作系统要管理库,先描述,再组织。本质:所有系统进程中公共的代码和数据,只需要存在一份。

2.谈谈编址,可执行程序

        可执行程序本身是有自己的格式信息的,我们进程地址空间里面的很多地址数据,是从可执行程序中来的,虚拟地址空间本身不仅是OS要遵守,编译器编译也要遵守,如果我们的可执行程序,没有被加载到内存中,我们的程序中没有地址呢:本来就有地址,其实我们的可执行程序,在没有加载之前,也已经基本被按照类别已经将可执行程序划分为各个区域了。   

  • 当动态库被加载时,它的代码和数据会被加载到物理内存中。
  • 动态库加载后,会被映射到该进程的地址空间中。具体来说,是先在页表中填写好对应虚拟地址和物理地址之间的映射关系,才被映射到进程地址空间中的共享区中。
  • 如果此时另一个进程也要加载该动态库,只需要填写它的页表的映射关系即可,不需要再从磁盘中加载一份动态库代码和数据,如果所需库不在内存中才需要加载。
  • 这样就保证了一个动态库最多只在内存中存在一份,大大节省了内存开销。

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

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

相关文章

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下,返回状态为fulfilled,值为undefined。 所以可以直接进行.then操作: this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式(Regular Expression,常简写为regex、regexp或RE)是一种强大的文本处理工具,它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

草莓不是莓,西瓜才是莓——解读 Kubernetes 中被驱逐的 Pod

每天都有成千上万的 Pod 从节点中被驱逐。它们无家可归、困惑不已,不得不放弃之前的生活方式。其中一些甚至变成无节点状态。 在 Kubernetes 中 Pod 被驱逐意味着什么?我们常常能看到 Pod 因为资源不足被终止。但为什么会发生这种情况呢? 驱…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

ElementUI组件库,分页组件靠右显示

ElementUI组件库,分页组件靠右显示 分页组件 ,el-pagination组件默认靠左显示,靠右显示的话只需给layout添加一个“->”属性值即可, 看图

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场,润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…

IDEA services模块无法启动springboot服务(添加了springboot但是为空白)

https://blog.csdn.net/m0_54042402/article/details/117918995 https://blog.csdn.net/qq_46550964/article/details/122235235 Alt8 显示services模块 发现有springboot启动模块,点一下springboot之后,这个模块就消失了 会自动在.idea文件夹下的work…

选专业填志愿,家庭经济条件是必须考虑因素

对比过去,大部分家庭的物质条件已经好很多了,但也有一部分家庭条件较为困难,对于家庭条件较为困难的高考学生而言,高考志愿填报需要考虑的因素更多,因为自己就读的专业,绝对不能是自己的家庭无法负担的专业…

数值分析笔记(三)函数逼近

最佳平方逼近 函数逼近是使用一种简单易算的函数来近似表示一个复杂函数。 该问题可转化为求解线性方程组 G n C F n ​ G_{n}CF_{n}​ Gn​CFn​​ 其中,系数 C ( c 0 , c 1 , ⋯ , c n ) T , F n ( ( f , φ 0 ) , ( f , φ 1 ) , ⋯ , ( f , φ n ) ) T C(c…

Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress; import java.io.IOException; class Main {public static void main(String[] args) {try { InetAddress localAddress InetAddress.getLocalHost(); //获得本地主机 InetAddress remoteAddress InetAddress.getByName("www.itcast.cn&qu…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中,我们介绍了大语言模型与人类对齐的“3H原则”,以及基于人类反馈的强化学习方法(RLHF),本文将继续介绍另外一种非强化学习的对齐方法:直接偏好优化&am…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException?2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

鸿蒙开发系统基础能力:【@ohos.inputMethod (输入法框架)】

输入法框架 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import inputMethod from ohos.inputMethod;inputMethod8 常量值。 系统能力:以下各项对应的系统能力均为Sy…

NetSuite Account Merge 科目合并功能分析

最近项目中,客户有提到过能否将不用的Account与新建的Account进行合并,即我们所说的Merge功能~可以,但是该功能有使用的限制,比如最直接的一点需要注意,不同类型的Account是不可以使用Merge功能的&#xff…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

一文2000字记录基于jmeter+perfmon的稳定性测试

01、任务情况 1、任务总览 本次平台稳定性测试的目的在于:在服务器压力处于较饱和(达到80%系统最大TPS)压力之下,在较长时间(>8小时)之内观测服务器稳定性问题,以及资源使用情况和异常。 …

uniapp或安卓对接扫码枪

背景介绍 最近老板又随便丢过来一个扫码枪让我研究快速上线,我心想着又是什么串口通信吗,结果发现是usb的,我想着是不是有什么协议,结果直接插上电脑或者手机 均可在输入框直接输入,不用任何的代码编写 但结合了一下…

MFC案例:自制工具条(Toolbar)按钮的小程序

程序目标:在基于对话框的MFC项目中,自制三个 Toolbar 按钮(用颜色区分,分别为红、绿、蓝);程序运行时,单击红色按钮显示一个红色的填充椭圆;再单击绿色按钮则进行清屏;最…

基于AT89C52单片机的超声波测距设计—数码管显示

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456475?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+10 在这里插入图片描述 题 目: 基于52的超声波测距汽车防撞系统 学生姓名 [姓名] 学 号 [学号…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数; 2.遍历字符串: 2.1.若当为左括号,则need,表示…