LinuxOS-IO-动静态库

news2024/11/17 14:28:25

文章目录

  • AMC的了解
  • 动静态库
    • 1.理论理解
    • 2.如何制作一个库??
          • 了解
      • 实验:制作库
      • 交给别人使用
        • 生成静态库
            • 生成文件 删除文件 发布文件
        • 使用静态库?
        • 生成动态库
        • 使用动态库

AMC的了解

Access:文件最近被访问的时间。

  • 我们发现实际操作下来,文件时间貌似没有变化?

    在比较新的Linux内核中,Access时间不会立即更新,而是存在一定的时间间隔OS才会自动更新时间。相比于修改文件,访问文件的次数会更多很多,如果一直进行更新时间,可能会造成刷盘的问题让操作系统越来越卡。

Modify:最后一次修改文件内容的时间,当我们修改文件内容的时候,有可能修改文件的属性,比如更改文件的大小属性。
Change:最后一次修改文件属性的时间

  • 在更改文件后,makefile和gcc是如何判断文件是被修改的的?根据时间问题
    根据可执行程序和文件的时间属性来判断文件是否已经被编译完毕了,指导系统那些文件需要编译。
    如果可执行程序的时间更新,就说明已经完成对于文件的编译,Makefile就不让你继续make了。
    反之……。
    伪目标就是一直被编译,不考虑上述时间属性而touch一个已经存在的文件,就会造成文件的时间的更新,即使内容没有被修改仍然可以重新编译。

动静态库

1.理论理解

  • ldd +可执行程序:显示可执行程序依赖的库。
    在这里插入图片描述

  • 一般库是分两种:动态库和静态库,真正的存在于磁盘上的文件

  • 在Linux中,如果是动态库:文件时以.so为后缀。静态库是以.a为后缀的。动静态库本身就是文件!

  • 库文件的命名: libXXX.so or libYYY.a库的真是命名:去掉lib前缀,去掉.a-,.so(包含)后缀,剩下的就是库名。

  • gcc默认是动态链接编译,
    一般的编译器可能没有内置语言的动态库,而只有动态库。
    在这里插入图片描述

  • 怎么证明命令是C语言写的呢?用到了C语言标准库

    Linux操作系统中的指令都会引用到C标准库,如果删除了就会导致系统指令的不可使用。

2.如何制作一个库??

了解

首先,库本身就是第二进制的文件,vim -l /lib64/libc-2.17.so

在这里插入图片描述

  • 我们如何得知一个库给我们提供了什么方法以及参数细节呢?
    一套完整的库包含:1.库文件本身2.头文件3.说明文档。
    头文件是文本的,会说明库中暴露出库中的基本使用方法。
    在这里插入图片描述

  • 我们在C中为什么写代码的时候,有时候是.h里面放上声明,.cpp放上实现?
    因为我们要制作库!方便使用和安全(给别人的是头文件)

实验:制作库

mytest.c中只包含了.h文件,找得到声明但是找不到.c文件中的实现。
在这里插入图片描述

那么如何实现调用test_lib中的文件呢?

  • 法一:
    在这里插入图片描述

  • 法二:
    在这里插入图片描述

​ 注意:1. 将test_lib中的.c文件全部生成.o文件放在当前文件夹。2. $<:是自动依次打开。3.配置Makefile时,%.o 的意思就是将目录下面的所有.o文件一次打开作为依赖对象,汇编之后形成的.o文件叫做目标文件。

交给别人使用

生成静态库

  1. 提供源代码 + 头文件
    我们的 mytest形成是由所有的.o文件项链接,只需要给你提供.o文件也可以实现链接,将所有的.o文件打包就是库文件。

  2. 我们将自己写的库交给别人使用,我们只需要将生成所有的.o文件交给他就行,源文件不需要交给,给静态库。

  3. 生成静态库

    • Makefile配置

      libmymath.a:sub.o add.o//没找到就先执行下面的生成.o文件的命令
          ar -rc $@ $^
      %.o:%.c
          gcc -c $<
      

      ar:将.o文件打包形成归档文件。rc:replace creat 如果没有就创建,如果有就替换。

      ar -tv 查看库中的内容

      在这里插入图片描述

    在这里插入图片描述

    我们将所有的.o文件打包为.a文件,静态库来交给别人实现自己源代码的隐藏。

    为了让别人知道我们的库中都实现了哪些方法,我们把.h文件的声明也给他就行了。

    • 生成文件 删除文件 发布文件

    在这里插入图片描述

    • 如果想在生成的过程中也直接安装到系统当中,可以在Makefile后添加:

      .PHONY:install
      install:
      	cp *.h /usr/include
          cp libmymath.a /lib64
      

      然后执行时make install就行。

使用静态库?

原文件包含头文件,直接gcc test.c会发生报错,因为包含的头文件是在lib目录之下,编译器在找的时候只会找统计目录下的.h文件并不会到统计目录中的目录中再去找,也就是说.h文件要和源文件在同级目录下,所以添加-I ./lib告诉他头文件搜索路径,-L指明库文件搜索路径(否则是连接时报错)。而头文件我们在源文件头已经指明包含,但是库你并没指明要连接目录下面的哪一个库名,所以还需要添加-l mymath这个库。

gcc test.c -I./lib -L./lib -l mymath

指明头文件搜索路径 指明库文件搜索路径,指明要连接那一个库。
在这里插入图片描述

  • 那么我们之前写的代码,为什么没有这些指明选项呢?
    之前的库,在系统的默认路径下:/lib64,/usr/lib,/usr/include等编译器是能识别这些路径的
  • 如果我不想带这些选项,我们可以把对应的库和头文件拷贝到默认路径下,但是不推荐。
    上面的过程就是一般软件的安装过程,使用静态库就完成了。
  • 我们给别人交付output的就是一个库文件加一套头文件。

生成动态库

  • 交给别人使用,配置Makefile。-shared:形成一个共享库,使得别人使用的时候直接gcc就行。
    在这里插入图片描述

在这里插入图片描述

使用动态库

出现可编译不可执行的问题:
-l mymath 只是告诉了编译器头文件在哪里,当编译好之后,与编译器无关了。想运行时,要有加载器加载到内存,所以运行时要告诉加载器库在哪里。

  1. 将动态库放到/lib64目录下,不推荐。2. 环境变量LD_LIBRARY_PATH指明程序启动之后,库的搜索路径,默认是没有设置的,设置语句之后你不用加上库的名字,因为在链接的时候就已经指明知道是哪个库了,知道连接什么库只是没找到罢了。

在这里插入图片描述

  1. 环境变量设置之后,再次登录时没有的了,为了让他每次都生效,可以配置全局环境变量。

总结:

我们其实一直在直接或者间接的使用第三方库(C/C++)。

  • 如何使用呢?拿着别人的库和头文件,加入到自己的项目中。

  • 如何制作呢?

    首先,.o可重定向目标文件,每一个.c对应一个.o文件。所有的源代码都需要先被编译为.o文件。

  1. 可以先把自己的源文件编译为.o文件。

  2. 制作动静态库的本质,就是将所有的.o打包。使用ar 静态库或者gcc打包动态库。

  3. 交付include + .a 或者.so文件。

  4. 静态库:ar -rc。

  5. 动态库:gcc -fPIC -shared

  6. 如果只提供静态库,我们只能将我们的库静态连接到我们的程序中。
    如果只提供动态库,只能将我们的库采用动态链接 ±static静态连接一下,但是只有动态库是无法这样静态连接的,一般需要提供两个版本的库文件。
    gcc g++优先链接动态库,所以你想静态连接必须在Makefile中手动添加-static
    如果现在系统中没有安装静态库,/usr/bin/ld:cannot find -lc显示无法找到c库。

    • 为什么我们之前所写的所有代码都没有/usr/bin/ld :cannot find -lc报错呢?默认是动态的,因为我们之前一定有动态库。因为系统中的很多命令是用C语言写的,而且是动态链接。

    使用外部库:

    系统中有很多库通常由一组互相关联的用来完成某项常见的工作的函数构成。比如,

    • pow(a,b);求a的b次方,包含#include<math.h>,-lm表示要连接libm.so或者libm.a库文件。

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

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

相关文章

谁在「元宇宙」里卖咖啡?

作者 | 曾响铃 文 | 响铃说 全球首个全场景数实融合的「世界杯元宇宙」音乐盛典&#xff0c;已经落下了帷幕。 在14日与16日举办的两场动感地带世界杯音乐盛典中&#xff0c;既能看到周杰伦、李宇春、G.E.M。邓紫棋、周深等乐坛大咖&#xff0c;又能看到动感地带数智代言人橙…

字节跳动首发485道Java岗面试题(含答案)

就目前国内的面试模式来讲&#xff0c;在面试前积极的准备面试&#xff0c;复习整个 Java 知识体系将变得非常重要&#xff0c;可以很负责任地说一句&#xff0c;复习准备的是否充分&#xff0c;将直接影响你入职的成功率。 但很多小伙伴却苦于没有合适的资料来回顾整个 Java …

docker搭建gitlab 服务器

1、搜索gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/gitlab-ce:latest 2、启动Gitlab容器 docker run \-itd \-p 9000:80 \-p 9022:22 \-v /home/gitlab/etc:/etc/gitlab \-v /home/gitlab/logs:/var/log/gitlab \-v /home/gi…

drupal远程代码执行 (CVE-2018-7600)漏洞学习与复现

文章目录一、漏洞描述二、POC&EXP一、漏洞描述 drupal是一个开源PHP管理系统&#xff0c;架构使用的是php环境mysql数据库的环境配置。在Drupal 6.x&#xff0c;7.x&#xff0c;8.x系列的版本中&#xff0c;均存在远程代码执行漏洞。该漏洞产生的原因在于Drupal对表单渲染…

ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度传感器的子卡&#xff0c;插在这个板子上&#xff0c;然后写了一些有意思的应用程序。 硬件实现原理…

Nacos2.2版本发布了,我为其贡献了几行代码并适配了PostgreSQL插件

目录 一、背景 二、个人贡献 三、Nacos使用适配的PostgreSQL插件 3.1、插件源码工程项目结构&#xff1a; 3.2、打包加载插件 3.3、修改配置文件为PostgreSQL连接字符串 3.4、导入数据库脚本文件 四、总结 一、背景 Nacos 是 Dynamic Naming and Configuration-Servic…

计算机毕设Python+Vue心灵治愈服务平台(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++那些事之高效率开发C++/C

1.神器 目前开发C/C用的比较多的当属Vim、VS code、CLion。 Vim配上插件编写C/C效率高的不少。 VSCode配上自定义配置及快捷键、vim插件效率跟vim旗鼓相当。 CLion因其独特的CMakeLists.txt管理方式及强大的代码补全等功能&#xff0c;编写本地代码绝对好于前两者。 但是对…

什么是数据指标体系?

定义 对当前业务有参考价值的统计数据 作用 监控业务情况 通过拆解指标寻找当前业务问题 评估业务可改进的地方&#xff0c;找出下一步工作的方向 常用数据指标 谁&#xff1a;用户数据 干了什么&#xff1a;行为数据 结果怎样&#xff1a;业务数据 选好数据指标的通用…

大数据学习:学生排序

文章目录一、提出任务二、任务过程&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建学生映射器类5、创建学生归并器类6…

Python变量类型教程

变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此&#xff0c;变量可以指定不同的数据类型&#xff0c;这些变量可以存储整数&#xff0c;小…

Springboot跨域处理的几种方式

作者简介 作者名&#xff1a;编程界小明哥 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性&#xff0c;喜欢跟广大ADC一起打野升级&#xff0c;欢迎您关注&…

基于springboot+mybatis的制造行业供应链管理系统

一、项目简介 基于springbootmybatis的制造行业供应链管理系统 二、实现功能 支持基础数据、用户管理、职务管理、修改密码、客户账号管理、组织管理 物料管理、物料短码、物料短码查询、物料分类维护 项目类别维护、分配采购员、设置最大最小库存、物料检验项管理 部门管…

Elasticsearch入门、API操作

文章目录概念倒排索引es的一些概念安装ES、Kibana总结索引库操作mapping映射属性创建索引库和映射查询索引库修改索引库删除索引库总结文档操作新增文档查询文档删除文档修改文档全量修改增量修改RestAPI引入依赖、初始化RestClient索引库 操作创建索引库删除索引库判断索引库是…

[附源码]Python计算机毕业设计黑河学院校友交流网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ABBYY2023PDF及OCR文字识别软件

ABBYY FineReader PDF2023最新版使专业人士在数字化工作场所能够更大限度地提高效率。 FineReader PDF 的特色是采用了 ABBYY 新推出的基于 AI的OCR 技术&#xff0c;可以更轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 现在&#xff0c;信息工…

U盘安装CentOS7

官网找到CentOS7的ISO镜像&#xff1a;CentOS-7-x86_64-DVD-2207-02.iso&#xff08;大小4.42G&#xff09; 准备一个8G的U盘&#xff0c;格式化&#xff0c;然后通过UltraISO工具将ISO镜像写入到U盘。 接着开机启动U盘&#xff0c;华硕是按esc键。 选择install cenetos7 li…

【图像处理】打靶仿真系统【含GUI Matlab源码 1043期】

⛄一、打靶仿真系统简介 1 课题描述 2 课题建模过程 a)第一&#xff0c;获取武器的各个参数&#xff0c;并且由这些参数计算武器在方向和高低上的响应公算偏差&#xff1b; b)第二&#xff0c;射击过程中方向和高低上的偏差呈正态分布。在matlab中取normrnd函数实现改功能&am…

《C语言深度解剖》二 static

最名不副实的关键字 static 认识多文件如下 extern 需要extern先声明在使用 生命没有开辟空间&#xff01;100 在main.c里 所有的变量声明的时候&#xff0c;不能设置初始值 为什么要有头文件 头文件要包含 变量的声明int g_val 函数的声明void show(),没有函数的声明虽然可…

CentOS7配置VNC远程桌面

桌面还是有很多方便的地方&#xff0c;在用U盘给电脑安装了centos7&#xff08;带gnome&#xff09;后&#xff0c;接着就需要弄远程桌面。 &#xff08;1&#xff09;安装vncserver yum -y install tigervnc* &#xff08;2&#xff09;启动vnc服务 vncserver &#xff0…