Linux系统中的静态库和共享库,以及一些计算机的基础知识

目录

1.库文件

2.静态库

3.共享库

4.静态库与共享库的区别

5.计算机基础知识

6.进程的基础知识

7.主函数的三个参数


1.库文件

1).库文件
库是一组预先编译好的方法的集合;
Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64)
库的头文件放在/usr/include
2).库的分类
静态库:libxxx.a(命名规则)
共享库:libxxx.so(命名规则)

3).准备文件:

//add.c
int add(int x,int y)
{
    return x+y;
} 

//max.c
int max(int x,int y)
{
    return x>y?x:y;
} 

//main.c
#include <stdio.h>
#include "foo.h"
int main()
{
    int a=5,b=10;
    printf("a+b=%d\n",add(a,b));
    printf("max=%d\n",max(a,b));
    return 0;
} 

//foo.h
int add(int x,int y);
int max(int x,int y);

2.静态库

(1).静态库的生成及使用
1)先将需要生成库文件的所有.c文件编译成.o文件;(目标文件)
2)创建静态库(使用ar命令)
ar crv libxxx.a xxxx.o xxx.o
c:创建库
r:将方法添加到库中
v:显示过程

(2)静态库的使用
gcc -o main main.c   -L. -lxxx
-L:指定库的存储位置
-l:指定库的名称(不需要前面的lib和扩展名.a)

例如:gcc -o main main.c -L. -lfoo

(3).静态库的缺点:
当你同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本.而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间;

3.共享库

(1)将所有的.c文件编译成目标文件.o
(2)将所有目标文件打包生成共享库:
gcc -shared -fPIC -o libxxx.so xxx.o xxx.o
(3)共享库的使用:
gcc -o main main.c -L路径 -l库名

共享库执行的时候会出错,找不到对应的共享文件:比如libfoo.so;

注意:共享库必须要放到标准路径下:
sudo mv libxxx.so /usr/lib
补充一个命令:
查看使用了那些共享库:ldd main

4.静态库与共享库的区别

共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;
而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);
共享库便于升级.

静态库的好处是在目标机器上运行程序的时候,就不再依赖于这个机器的空间,因为已经将方法都包含进来了;而共享库就是只有一份共享,比较节省空间,但是坏处就是运行的时候,这个主机上必须有这个库文件,没有程序就会运行失败;

5.计算机基础知识

1.计算机组成五大部件:
(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。
(2) 控制器 : 它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。
(3) 存储器 :存储程序和各种数据。
(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。
(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。

2.一台计算机可以抽象成下图:

CPU中包含控制器和运算器,内存就是存储器.I/O设备就是输入设备和输出设备,如:键盘,显示器,鼠标,硬盘,网卡;
3.系统总线
(1)数据总线:用来在各个功能部件中间传输数据,是双向传输总线;
(2)地址总线:用来指出数据总线上的源数据或目的数据在主存单元的地址或IO设备的地址;
(3)控制总线:由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么
在某一时刻由谁来使用,就是控制总线负责完成的.
4.指令相关概念:
(1) 指令 : 是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码和操作码。
(2) 程序 : 由一条一条的指令构成。
(3) 指令周期 : cpu 每取出并执行一条指令所需的全部时间称为指令周期。
(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
(5) RISC :精简指令系统计算机。(Reduced Instruction Set Computer)
RISC技术是用20%的简单指令的组合来实现不常用的80%的那些指令功能,但这不意味着RISC技术就是简单地精简其指令集.在提高性能方面,RISC技术还采取了许多有效措施,最有效地方法就是减少执行地执行周期数.
(6) CISC :复杂指令系统计算机。(Complex Instruction Set Computer)
(计算机组成原理332页:关于精简指令系统计算机,复杂指令计算机)
(7) 程序与指令: 高级语言 汇编助记符 机器指令

6.进程的基础知识

1).进程:一个正在运行中的程序;
2).PCB:进程控制块,进程描述符(PID:进程唯一的标识符)
进程控制块是用一个结构体struct task_struct来实现;

<<操作系统精髓与设计原理第六版>>74页;

3).进程的状态:
就绪,阻塞,运行;

时间片轮转调度;

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配
一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程
还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结
束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用
完它的时间片后,它被移到队列的末尾。

4).并发与并行

5).操作系统发展史:
操作系统:管理计算机上的软硬件资源,为用户提供一个交换的接口;
(1)串行处理;
(2)简单批处理;
(3)多道程序设计
(4)分时系统

<<从哲学层次上看操作系统>>第一篇第2章操作系统历史 19页;

<<操作系统精髓与设计原理>>第35页.

7.主函数的三个参数

1).主函数的三个参数的含义:

argc:主函数的参数个数

argv:主函数的参数内容

envp:环境变量;

2).演示代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[],char *envp[])
{  
    int i=0;
    printf("argc=%d\n",argc);

   // for(;i<argc;i++)
   for(;argv[i]!=NULL;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);
    }
     return 0;
}

gcc -o main main.c 
./main
./main hello 123
#观察运行结果思考argc和argv参数的含义;

3).环境变量

 for(i=0;envp[i]!=NULL;i++)
 {
      printf("envp[%d]=%s\n",i,envp[i]);
 }

4).总结:

argc:传递给主函数的参数个数
argv:传递给主函数的参数列表,字符指针数组,给主函数传递的参数都是字符串;(以NULL结尾)
envp:继承的环境变量列表,以NULL结尾;

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

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

相关文章

纯CSS实现魔法渐变边框卡片

如图所示&#xff0c;这是一个很炫酷的卡片效果&#xff0c;关键效果在于卡片的边框呈渐变色变化着&#xff0c;在网页中有这样一个卡片相信可以极大的增强用户体验交互。本次文章将解读如何使用纯CSS实现这个炫酷的卡片效果。 基于上面的动图可以分析出以下是本次实现的主要几…

【java零基础入门到就业】第五天:java语言的发展和java语言的具体现实应用场景

文章目录 1、java 语言的发展2、java能干什么2.1 java的三大分类2.2 java能做什么1、java 语言的发展 Java 是一种广泛使用的编程语言,经历了多个阶段的发展。以下是 Java 语言的主要发展阶段: 诞生(1995 年): Java 由 Sun Microsystems(后来被 Oracle 收购)的 James …

YOLO的bounding boxes

YOLO使用了 77 网格 (SS)、2 个bounding boxes (B2) 和 20 个类别 ©。 1.YOLO将输入的图片resize成448 x 448&#xff0c;并且为 S x S&#xff08;S 7&#xff09;个grid&#xff0c;如果物体的中心落入该grid中&#xff0c;那么该grid就需要负责检测该物体。 2.对于每…

关于ASJ系列剩余电流动作继电器的功能介绍-安科瑞 蒋静

1.概述 在工业应用中&#xff0c;剩余电流继电器与外部剩余电流互感器结合使用以检测和评估接地故障电流。它们也可以与保护装置结合使用&#xff0c;以实现电路的断开&#xff0c;从而实现对线路和人员的保护。 2.剩余电流的定义以及危害 剩余电流&#xff0c;是指低压配电线…

制造业工厂MES系统中的设备管理模块

随时工厂数字化建设的大力推进&#xff0c;设备管理的效率得到了很大的提升&#xff0c;特别是作为机加工企业&#xff0c;设备是整个企业非常重要的核心资产。下面是万界星空科技MES系统中的设备管理模块介绍&#xff1a; 1、MES设备管理任务模型 制造企业总是期望设备能够在…

龙芯loongarch64安装grpcio失败解决办法

什么是gRPC gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统用protocol buffers IDL定义一个服务,指定能够被远程调用的方法及其参数和返回值类型 使用protocol buffers 编译器插件,将服务定义的.proto文件,编译成客户端和服务端的代码 …

[EFI]技嘉 Z490 VISION G i5-10500 电脑 Hackintosh 黑苹果引导文件

硬件配置 硬件型号驱动情况主板技嘉 Z490 VISION G CLPC controller Z490芯片组&#xff09;处理器英特尔 Core i5-10500 3.10GHz 六核已驱动内存16GB&#xff08; 威到DDR42655MHz8GBx 2〕已驱动硬盘SSDSC2BB150G7R (150 GB/ 国态硬盘&#xff09;已驱动显卡AMD Radeon RX 58…

2024 AIGC 规划:探索交互体验变革及 智能硬件基础设施篇

TL;DR Run LLM/Embedding on Android: https://github.com/unit-mesh/android-semantic-search-kitInference SDK&#xff1a;https://github.com/unit-mesh/inference 正文&#xff1a; 在过去的一年时间里&#xff0c;国内外大中型公司都在探索、引入了 GenAI / AIGC&#xf…

记一次FastJson报错

文章目录 报错内容原因探寻原因及解决方案 报错内容 起因是一段很普通的字符串转Java对象的代码&#xff0c;在本地和内网测试都没有问题&#xff0c;偏偏外网一跑就报错&#xff0c;错误如下: 报错的代码特别简单&#xff0c;涉及到公司代码这里用测试代码演示&#xff0c;就…

Java简介

一、Java简介 Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象…

国内外四款强大的远控使用体验:ToDesk、向日葵、AnyDesk、Microsoft 远程桌面横向比较

目录 一、引言 二、横测体验 1、ToDesk 2、向日葵 3、AnyDesk安力桌 4、Microsoft 远程桌面 三、评测总结与建议 一、引言 随着科技快速发展和数字化进程的驱动&#xff0c;远程控制软件在日常生活和工作中变得愈加广泛。无论是在家办公、技术支持还是远程教育&#xff…

使用Java实现一个简单的贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。 然后&#xff0c;创建贪吃蛇游戏的Java项目命名为snake_game&#xff0c;并在这个项目里创建一个文件夹命名为images&#xff0c;将图片素材导入文件夹。 再在src文件下创建两个包&#xff0…

【rl-agents代码学习】01——总体框架

文章目录 rl-agent Get startInstallationUsageMonitoring 具体代码 学习一下rl-agents的项目结构以及代码实现思路。 source: https://github.com/eleurent/rl-agents rl-agent Get start Installation pip install --user githttps://github.com/eleurent/rl-agentsUsage…

PaaS基础建设

PaaS&#xff08;Platform-as-a-Service&#xff1a;平台即服务&#xff09;是应用程序和服务的部署平台。Paas为开发、测试和管理软件应用程序提供所需的开发环境&#xff0c;是云计算服务类型之一。 PaaS是什么&#xff1f;IaaS、SaaS、PaaS三种云服务区别 PaaS&#xff08;P…

​《水经注全国三维离线GIS系统》硬件安装教程

有些工作&#xff0c;是需要一些外在动力才能完成的。 为什么这么讲呢&#xff1f; 因为正是在客户的要求下&#xff0c;我们才撰写了《水经注全国三维离线GIS系统》的硬件安装教程&#xff0c;而且还录制了视频教程。 当用户收到货物以后&#xff0c;就可以通过本教程清点货…

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)

本章的内容: 什么是函数栈帧&#xff1f; 理解函数栈帧能解决什么问题&#xff1f; 函数栈帧的创建和销毁解析 本文放到 --> 该专栏内&#xff1a;http://t.csdnimg.cn/poMzA 目录 什么是函数栈帧❓ 理解函数栈帧能解决什么问题呢&#xff1f;&#x1f4a2; 函数栈帧的…

计数排序及优化

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX&#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&a…

汽车一键启动智能系统功能作用

在现代科技的推动下&#xff0c;我们的生活每天都在发生着变化。其中&#xff0c;汽车智能一键启动系统就是科技改变生活的最好例子之一。 首先&#xff0c;我们来简单了解一下汽车智能一键启动系统。它是一种利用先进的电子技术和无线通信技术&#xff0c;实现无需钥匙即可启…

基于单片机智能输液器监控系统的设计

**单片机设计介绍&#xff0c; 基于单片机智能输液器监控系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能输液器监控系统可以实现对输液过程的实时监测和控制&#xff0c;以下是一个基本的设计介绍&am…