Linux 动静态库和_make_进度条(一)

文章目录

  • 一、如何理解条件编译
  • 二、动静态库
    • 1. 理论
    • 2. 实践
    • 3. 解决普通用户的sudo问题
    • 4. 技术上理解库
  • 三、make和make_file

一、如何理解条件编译

1.
在这里插入图片描述

gcc code.c -o code -DM 命令行级别的宏定义

在这里插入图片描述

预处理的本质就是修改编辑我们的文本代码

  1. 头文件展开到源文件中
  2. 去注释
  3. 宏替换
  4. 条件编译
宏定义的默认值是1
可以自己设置宏定义的值
-DM=100 -> #define M = 100 插入到我们的代码中

在这里插入图片描述
条件编译的用途?

  1. 软件进行专业度,收费情况进行区分(业务),使用条件编译,可以进行代码的动态裁剪,比如vs2022分为社区版和专业版
  2. Linux的内核源代码也是采用条件编译的方式进行代码的裁剪的
  3. 开发工具,应用软件,比如一款软件可以在windows下跑,也可以在linux下跑,在windows下就把Linux的代码裁掉,在linux下就把windows的代码裁掉

为什么C/C++编译,要先变成汇编?
4. 因为根据历史的发展,C语言如果直接编程二进制的机器语言成本太高了,那时候汇编的发展了几十年了,C语言变成汇编(然后汇编变成二进制是不需要我们处理的)打孔编程也叫二进制编程
在这里插入图片描述
编译器的发展过程
6. 自举过程:先出现汇编语言,然后发明用二进制版的汇编编译器编译汇编语言,之后迭代后,发明汇编语言的编译器编译汇编语言
在这里插入图片描述

二、动静态库

1. 理论

ls /usr/lib64 linux系统中自带的库

1. 库:是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,二次开发)
二次开发:比如printf函数不需要我们自己实现,可以直接调用

什么叫做动静态库,什么叫做动静态连接,如何理解?
1.动态库:linux(.so),windows(.dll)
2.静态库:linux(.a),windows(.lib)

2. lib是前缀,.so是后缀,中间的是c,就是C语言的库,是xyz,就是xyz的库
在这里插入图片描述
3. 动态库内部实现的方法我们自己实现的程序会使用库中的方法这两者链接起来形成可执行程序
在这里插入图片描述
4. 动态链接:执行目标方法,需要跳转到库中执行,执行完后在返回
静态链接:直接把静态库中的方法拷贝到目标程序中,直接在目标程序中执行这个方法

在这里插入图片描述

动态链接:

  1. 程序通过动态链接找到动态库,程序加载到内存中,在内存中往下执行任务,执行到上网这个任务时,通过库函数调用找到动态库实现,实现完之后就库函数返回
  2. 很多人都可以到网吧上网,所以网吧就是共享库被多个程序共享,一旦缺失,会导致所有程序无法执行
    在这里插入图片描述
    静态链接:
  3. 可以把电脑仓库中的电脑拷贝到我们的程序中,这样就不需要网吧了,把我们程序中使用的库方法拷贝给我们自己,静态库只有在链接的时候有效,一旦形成可执行程序,静态库可以不再需要
    在这里插入图片描述
    动静态库的对比:
  4. 动态库形成的可执行程序的体积一定很小
  5. 可执行程序对静态库的依赖程度很小,对动态的库的依赖程序大,所以动态库不能缺失
  6. 程序运行需要加载到内存,静态链接的会在内存中出现大量重复的代码
  7. 动态链接的比较节省内存和磁盘空间

2. 实践

1.系统下的库
在这里插入图片描述
2. 默认系统是动态链接的,ldd 是 Linux 系统中的一个命令行工具,用于打印共享库依赖关系,file code显示具体的文件信息
在这里插入图片描述
3. 静态链接

显示静态库
gcc code.c -o code -static
安装C语言的静态库
sudo yum install -y glibc-static

在这里插入图片描述

4.C语言的静态链接
在这里插入图片描述
验证C++:

5.C++安装静态链接
在这里插入图片描述
6.C++静态链接
在这里插入图片描述
7.关于动态库

  • 动态库会在内存中存在一份,这一份是所有程序共享的
  • 运行时,每个程序会加载自己的可执行文件到内存中,因此静态库的代码拷贝会在内存中存在多份(每个程序一份),静态库不会存在内存中
    在这里插入图片描述

3. 解决普通用户的sudo问题

1. 出现普通用户无法使用sudo的问题,
使用vim进入 etc/sudoers中修改配置文件的100行左右的root复制一份,添加给普通用户

在这里插入图片描述

在这里插入图片描述

4. 技术上理解库

1. 可以像C语言一样实现多文件的链接使用,比如.c文件调用.h文件使用

在这里插入图片描述
上层中有.h文件和.o文件(包含了.c文件),可以实现功能main中调用函数,上层中把所有的.o文件打个包变成了可执行文件
.c
func1实现函数
func2实现函数
.h中是方法的声明
在这里插入图片描述

2. 可以将多个.o文件打包形成一个可执行文件并且和.h文件放到一起,.o文件中存在.c实现文件,这样可以把这个给别人使用而不暴露源文件

在这里插入图片描述
3. 所有的.o是一个库
在这里插入图片描述

4. 链接的本质是打包所有的.o文件(包括自己的.o和C语言库中的.o文件),和库C语言库中的.h文件一起形成可执行文件

在这里插入图片描述

三、make和make_file

1. make是一条命令,make_file是一个文件

在这里插入图片描述

2. 进入vim在Makefile文件中写入如下命令,这样使用make命令,就等同于使用如下命令

code:code.c
tab键(四个空格) gcc -o code code.c

在这里插入图片描述

3. 依赖关系和依赖方法

code:code.c 依赖关系
tab键(四个空格) gcc -o code code.c 依赖方法

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的拖恒ERP-物资管理

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Leetcode-853. Car Fleet [C++][Java]

目录 一、题目描述 二、解题思路 Leetcode-853. Car Fleethttps://leetcode.com/problems/car-fleet/description/ 一、题目描述 There are n cars at given miles away from the starting mile 0, traveling to reach the mile target. You are given two integer array …

Vue核心知识:动态路由实现完整方案

在Vue中实现动态路由,并结合后端接口和数据库表设计,是一个复杂的项目,需要多个技术栈和步骤的配合。以下将详细描述整个实现过程,包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…

CMU15445(2023fall) Project #4 - Concurrency Control踩坑历程

把树木磨成月亮最亮时的样子, 就能让它更快地滚下山坡, 有时会比骑马还快。 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering…

天疱疮是一种慢性、严重的皮肤疾病

天疱疮是一种慢性、严重的皮肤疾病,对患者的日常生活带来很大的困扰。为了更好地预防天疱疮的发生,我们需要了解其成因及传播途径,并采取相应的预防措施。以下是关于天疱疮预防的小知识。 一、了解天疱疮 天疱疮是一种自身免疫性疾病&#…

神经网络代码入门解析

神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…

解决android studio(ladybug版本) gradle的一些task突然消失了

今天不知道干了啥,AS(ladybug版本)右边gradle的task有些不见了,研究了半天解决了,这里记录下: 操作: File -->Settings-->Experimental--> 取消选项“Enable support for multi-vari…

软件测试之白盒测试知识总结

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 概念与定义 白盒测试:侧重于系统或部件内部机制的测试,类型分为分支测试(判定节点测试)、路径测试、语句测试…

Unity中动态切换光照贴图的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换)针对全桥LLC拓扑,利用Matlab软件搭建模型,分别对轻载&#xf…

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…

前端正则表达式完全指南:从入门到实战

文章目录 第一章:正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章:正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章:前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…

C++Primer学习(4.8位运算符)

4.8位运算符 位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能,如17.2节(第640页)将要介绍的,一种名为bitset的标准库类型也可以表示任意大小的二进制位集合,所以位运算符同样能用…

排序算法(3):

这是我们的最后一篇排序算法了,也是我们的初阶数据结构的最后一篇了。 我们来看,我们之前已经讲完了插入排序,选择排序,交换排序,我们还剩下最后一个归并排序,我们今天就讲解归并排序,另外我们还…

【Java项目】基于SpringBoot的Java学习平台

【Java项目】基于SpringBoot的Java学习平台 技术简介:采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构,前端通过浏览器与后端数据库进行信息交互,后端使用SpringBoot框架和MySQL数据库进行数据处理和存储,实现…

单例模式——c++

一个类,只能有1个对象 (对象在堆空间) 再次创建该对象,直接引用之前的对象 so构造函数不能随意调用 so构造函数私有 so对象不能构造 如何调用私有化的构造函数: 公开接口调用构造函数 调用构造函数:singleTon instance; 但…

lqb官方题单-速成刷题清单(上) - python版

预计3月5日 Wednesday 前完成 【2025年3月1日,记】题目太简单了,3月3日前完成 蓝桥杯速成刷题清单(上) https://www.lanqiao.cn/problems/1216/learning/?problem_list_id30&page1 替换题号1216 目录 进度题解和碎碎念1. 排…

虚拟化园区网络部署指南

《虚拟化园区网络部署指南》属于博主的“园区网”专栏,若想成为HCIE,对于园区网相关的知识需要非常了解,更多关于园区网的内容博主会更新在“园区网”专栏里,请持续关注! 一.前言 华为CloudCampus解决方案基于智简网络…

Java数据结构第十五期:走进二叉树的奇妙世界(四)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…

ISP 常见流程

1.sensor输出:一般为raw-OBpedestal。加pedestal避免减OB出现负值,同时保证信号超过ADC最小电压阈值,使信号落在ADC正常工作范围。 2. pedestal correction:移除sensor加的基底,确保后续处理信号起点正确。 3. Linea…