Linux的开发工具(三)

条件编译

预处理本质:对代码进行裁剪

像网易云音乐有vip和普通用户,可以通过条件编译来,这样只用写一份代码,也只用维护一份代码,是vip就走vip代码,不是就普通用户代码,条件编译来动态裁剪。

1 #include<stdio.h>2 #define M3 4 int main()5 {6 #ifndef M7         printf("free");8 #else9         printf("advance");10 #endif11 12 }
~                                                                                                                                                                                                              
~                                                                                                                                                                                                              
~                                                                                                                                                                                                              
~                                                                                                                                                                                                              
~                

为什么C/C++编译,要先变成汇编

因为刚开始电脑都是用按键来控制的,高低电平对应1和0,所以是二进制来命令电脑,但是二进制麻烦,所以有了汇编语言,但也要有编译器,汇编语言也是文本所以要翻译成二进制

C语言直接变成二进制or翻译成汇编再翻译成二进制,减少成本,C语言到汇编是文本到文本相对简单,再汇编到二进制可以站在巨人的肩膀上不用自己写。

汇编语言的编译器,用二进制版汇编编译器编译汇编语言,在用汇编语言写汇编编译器,然后用二进制汇编编译器编译汇编语言编译器,这样汇编编译器就可以用了,来编译汇编语言,这个行为叫编译器的自举过程

为什么要链接

预处理展开的是声明,没有实现

站在巨人肩膀上,把其它顶级大佬写的代码封装好,基本功能就不用自己写,直接写函数名,在链接时找到对应的实现方法

动态链接和静态链接

实际开发中,会出现多个源文件,而且多个源文件之间不是独立的,会存在多种依赖关系,如源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,既每个.c文件都会形成一个.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,形成一个可执行的程序。这个链接过程就行静态链接。

缺点:

浪费空间:每个可执行程序中对所有需要的目标文件都有一份拷贝,如果多个程序对同一个目标文件都有依赖,如调用printf函数,则多个程序都含有printf.o,所以同一个目标文件都在内存中有多个副本

更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。

动态链接的出现解决了静态链接的问题,基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时将它们链接在一起形成了一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。

root@iZbp1be068ksa92vuf0kbdZ:~/zym# gcc code.o -o code11
root@iZbp1be068ksa92vuf0kbdZ:~/zym# ls
code11  code.cpp  code.o
root@iZbp1be068ksa92vuf0kbdZ:~/zym# ldd code11linux-vdso.so.1 (0x00007ffec23cb000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45a0257000)/lib64/ld-linux-x86-64.so.2 (0x00007f45a048e000)
root@iZbp1be068ksa92vuf0kbdZ:~/zym# ./code11
hello worldroot@iZbp1be068ksa92vuf0kbdZ:~/zym# 

概念:库

系统把这些函数实现都被做到名为libc.so.6的库文件中去了,没有特别指定,gcc会收到系统的默认搜索路径,“/use/lib”下查找,也就是链接到libc.so.6库函数,这样实现函数printf,这就是链接的作用。

静态库和动态库

静态库是指编译链接时,把库函数的代码全加到可执行文件中,因此生成的文件比较大,但在运行时就不在需要库文件了,后缀名一般为“.a”

动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,可以节省系统开销,动态库后缀为“.so”,libc.so.6就是动态库,完成链接后就可以生成可执行文件

gcc hello.o -o hello

gcc默认生成的二进制程序,是动态链接,可以通过file命令验证

hello worldroot@iZbp1be068ksa92vuf0kbdZ:~/zym# file code11
code11: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=eedbea476e4b714e5d707af0c59df9609b1fd209, for GNU/Linux 3.2.0, not stripped

 (静态库和动态库名字都是.c加前面和后面组成的,动态库是前面+lib后面+.so.6)

举例:

小明考上了高中,但是他很喜欢打游戏,这个高中比较严格禁止电子产品,小明找到学长得知校外有网吧,小明从学长那里得到了网吧的地址,准备下午去上网,但是得先上课,小明的计划就是程序代码,到了1点小明要执行上网的程序,所以要去网吧上网,他要从学校跳到网吧,上网后又跳回到学校。小明是程序角色,学长是动态链接,高中是内存,网吧就是动态库,链接时得到了网吧地址,程序加载到内存中,程序开始时就知道了网吧的地址,所以执行上网就可以根据地址在动态库找到对应的函数。

例子二:

网吧被学校举办后只能关掉,但是小明没有网吧后成绩下滑,于是家长要求学校同意带电脑上学,但是下面一定要他上网吧的100号电脑,于是父亲找到老板要了100号机的配置信息配了一台一模一样的电脑放在了小明的宿舍,这时小明不用执行上网就要跳到校外去了,在学校里面就可以上网,这里把库的执行方法直接拷贝了一份到内存里,所以在执行程序时就直接有了实现方法,不用跳到别的地方。

 

执行静态链接代码:

gcc code .o  -o code -static

 

程序加载到内存时,还需要把库也加载进来,如果其它程序也用到了这个库,那么只要第一次加载,后面的就不需要加载动态库了,直接在内存跳到实现方法,保证公共的代码只出现一份。

命令大部分由C写,指令依赖动态库,会加载动态库,其它程序就不用加载。 

库的本质:被打包起来的.o文件

链接本质:把.o文件合在一起

粘滞位

在Linux系统中,`tmp`目录中的`t`权限代表的是“粘滞位”(Sticky Bit)。粘滞位是一种特殊的权限,它只适用于目录,而不适用于文件。当一个目录设置了粘滞位权限时,该目录中的文件只能由其所有者或者root用户删除或重命名,即使其他用户对该文件拥有写权限也无法删除或重命名这些文件。

例如,`/tmp`目录通常被设置为`drwxrwxrwt`,这意味着所有用户都可以读取、写入和执行该目录,但是由于设置了粘滞位,只有文件的所有者和root用户可以删除或重命名该目录下的文件。这样的设置可以防止一个用户删除或修改另一个用户在`/tmp`目录中创建的临时文件,从而增强了系统的安全性。

 自动化构建工具

先创建Makefile文件,code:code.c表示的是源文件是code.c(code:是源文件为什么),gcc -o code code.c是依赖方法要生成一个可执行文件,然后用make指令,这时目录下就有code可执行文件了。

代码示例

root@iZbp1be068ksa92vuf0kbdZ:~/zym# mkdir mk
root@iZbp1be068ksa92vuf0kbdZ:~/zym# cd mk
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# touch Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# ll
total 8
drwxr-xr-x 2 root root 4096 Nov 24 11:18 ./
drwxr-xr-x 3 root root 4096 Nov 24 11:17 ../
-rw-r--r-- 1 root root    0 Nov 24 11:18 Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# vim Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# cat Makefile
code:code.cgcc -o code code.c
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# ll
total 12
drwxr-xr-x 2 root root 4096 Nov 24 11:19 ./
drwxr-xr-x 3 root root 4096 Nov 24 11:17 ../
-rw-r--r-- 1 root root   32 Nov 24 11:19 Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# vim code.c
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# ll
total 16
drwxr-xr-x 2 root root 4096 Nov 24 11:20 ./
drwxr-xr-x 3 root root 4096 Nov 24 11:17 ../
-rw-r--r-- 1 root root   70 Nov 24 11:20 code.c
-rw-r--r-- 1 root root   32 Nov 24 11:19 Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# make
gcc -o code code.c
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# ll
total 32
drwxr-xr-x 2 root root  4096 Nov 24 11:20 ./
drwxr-xr-x 3 root root  4096 Nov 24 11:17 ../
-rwxr-xr-x 1 root root 15960 Nov 24 11:20 code*
-rw-r--r-- 1 root root    70 Nov 24 11:20 code.c
-rw-r--r-- 1 root root    32 Nov 24 11:19 Makefile
root@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# ./code
hello worldroot@iZbp1be068ksa92vuf0kbdZ:~/zym/mk# vim Makefile

 

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

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

相关文章

VSCode 汉化教程【简洁易懂】

VSCode【下载】【安装】【汉化】【配置C环境&#xff08;超快&#xff09;】&#xff08;Windows环境&#xff09;-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;…

Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成

Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 1、 Doxygen简介 Doxygen 是一个由 C 编写的、开源的、跨平台的文档生成系统。最初主要用于生成 C 库的 API 文档&#xff0c;但目前又添加了对 C、C#、Java、Python、Fortran、PHP 等语言的支持。其从源代码中提取注释&…

Linux网络——网络层

网络层的作用&#xff1a;在复杂的网络环境中确定一个合适的路径。 一.IP协议 IP存在的意义&#xff1a;IP地址提供一种能力&#xff0c;使得数据能够从主机B跨网络、可靠的送至主机A。 1.协议头格式 能够看出IP协议的格式与TCP协议存在很多相似之处&#xff0c;同样拥有4为首…

Shiro-550反序列化漏洞分析

&#x1f338; 环境配置 代码下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/refs/tags/shiro-root-1.2.4 下载完成之后&#xff0c;需要修改一下pom文件&#xff1a; 修改一下红色框中的配置。然后配置一下tomcat&#xff1a; 点击部署&#xff0c;然后…

【Rhino】【Python】Create a series of Blocks according to Value of object Property

文章目录 1. Complete Code Display2. Detailed Code Analysis2.1 Import and Setup2.2 Function Structure and Initial Setup2.3 Object Collection and Filtering2.4 Story Management System2.5 Locating Point Processing2.6 Object Organization by Story2.7 Block Creat…

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

【探寻密码的奥秘】-001:解开密码的神秘面纱

目录 1、密码学概述1.1、概念1.2、目的1.3、应用场景 2、密码学的历史2.1、第一时期&#xff1a;古代密码时代2.2、第二时期&#xff1a;机械密码时代2.3、第三时期&#xff1a;信息密码时代2.4、第四时期&#xff1a;现代密码时代 3、密码学的基本概念3.1、一般通信系统3.2、保…

文件操作详解(1)

1.文件&#xff0c;文件与流&#xff0c;文件指针 2.文件的打开与关闭 3.文件的读写 文件的顺序读写&#xff1a; &#xff08;1&#xff09;fgetc 和 fputc &#xff08;2&#xff09;fgets 和 fputs &#xff08;3&#xff09;fscanf 和 fprintf &#xff08;4&#x…

基于YOLOv8深度学习的人体姿态摔倒检测与语音报警系统(PyQt5界面+数据集+训练代码)

随着人口老龄化进程的加速&#xff0c;摔倒事故逐渐成为威胁老年人健康和安全的主要问题之一。研究表明&#xff0c;摔倒不仅可能导致老年人骨折、头部受伤等严重的身体损伤&#xff0c;还可能引发心理恐惧和行动能力下降&#xff0c;从而降低其生活质量和独立性。如何快速、准…

jmeter5.6.3安装教程

一、官网下载 需要提前配置好jdk的环境变量 jmeter官网&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 选择点击二进制的zip文件 下载成功后&#xff0c;默认解压下一步&#xff0c;更改安装路径就行(我安装在D盘) 实用jmeter的bin目录作为系统变量 然后把这…

差分进化算法原理与复现

目录 摘要1、算法原理1.1、种群初始化1.2、变异1.3、交叉1.4、选择 2、算法实现2.1、种群初始化2.2、变异2.3、交叉2.4、选择2.5、选取终代种群中最优秀个体 摘要 如何选取一组最佳的参数&#xff0c;使得代价函数值最优&#xff1f;这是优化算法做的事&#xff0c;一个直觉的…

搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)

在搜索场景中&#xff0c;BM25能计算每个文档与查询的匹配度&#xff0c;从中找出最相关的文档&#xff0c;并按相关性高低排序展示。 要理解BM25&#xff0c;需要掌握以下几个关键概念&#xff1a; 1. 词频&#xff08;Term Frequency, TF&#xff09;&#xff1a;某关键词在文…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式&#xff0c;枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述&#xff0c;如有错误&#xff0c;请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

【C++】list模拟实现(详解)

本篇来详细说一下list的模拟实现&#xff0c;list的大体框架实现会比较简单&#xff0c;难的是list的iterator的实现。我们模拟实现的是带哨兵位头结点的list。 1.准备工作 为了不和C库里面的list冲突&#xff0c;我们在实现的时候用命名空间隔开。 //list.h #pragma once #…

数字化工厂 MES试点方案全解析(三)

目 录 三、试点实施步骤 需求分析与方案设计阶段 系统开发与测试阶段 系统部署与培训阶段 试点运行与优化阶段 总结与评估阶段 三、试点实施步骤 需求分析与方案设计阶段 1、成立由企业生产、工艺、质量、设备、IT 等多部门人员组成的项目团队&#xff0c;与 MES 供应商共…

ShuffleNet V2:高效卷积神经网络架构设计的实用指南

摘要 https://arxiv.org/pdf/1807.11164 当前&#xff0c;神经网络架构设计大多以计算复杂度的间接指标&#xff0c;即浮点运算数&#xff08;FLOPs&#xff09;为指导。然而&#xff0c;直接指标&#xff08;例如速度&#xff09;还取决于其他因素&#xff0c;如内存访问成本…

【Opencv学习】PART1-图像基础处理

目录 一、图像的读入、显示和保存 1、读入图像 imread函数 范例 显示控制参数 2、显示图像 imshow函数 范例 tips waitkey函数 含义 delay参数: tips destoryAllWindows函数 3、保存图像 imwrite函数 范例 实操 01-读入显示保存 代码 结果 二、图像处理入…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段&#xff0c;帮助我们发现问题&#xff0c;识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里&#xff0c;除了panic问题…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…