代码编织梦想

Linux编辑器-vim的使用

编辑和退出

vim //即可打开vim
vim XXX //即可对某个文件进行编辑

: //也就是shift + ;,就可以把光标移到左下角(底行模式)
输入wq //w叫做写入(保存),q叫做退出
输入!wq //在无法写入或退出的情况下,这表示强制写入和强制退出

vim的多种模式

vim是一款多模式的编辑器,vim刚打开的时候是命令模式(默认打开的模式),想要写代码需要切换模式
![image.png](https://img-blog.csdnimg.cn/img_convert/69e5d6c250bb3e1fb4896152a05f5ead.png#clientId=u03cd37aa-5ab4-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=245&id=uc8f976d8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=306&originWidth=750&originalType=binary&ratio=1&rotation=0&showTitle=false&size=65222&status=error&style=none&taskId=uff33e045-826e-478a-aa00-fcc1df4e96e&title=&width=600)
vim编辑完代码保存退出后,gcc该文件,生成了个 .out文件(相当于vs2019中的编译),再./a.out即输出printf中的内容

i/F12 //就可以切换到编辑模式(也叫作插入模式)
ESC(exit screen) //回到命令模式

a.命令模式

命令模式NORMAL

yy //复制当前所在行
nyy //从当前行开始,复制n行

dd //剪切
ndd //从当前行开始,剪切n行
p //粘贴

u //撤销
Ctrl r//撤销撤销
文件只要不退出,即便保存了也可以u和Ctrl r,但是一旦退出就不行了

G(shift+g) //光标定位到文件结尾
gg //光标定位到文件开始
n G //光标定位到任意行
w 和 b //以单词为单位进行左右移动

h //向左移动 ↑
j //向下移动 ↓
k //向上移动 ↑
l //向右移动 →
(老式键盘里面没有上下左右键)

$(shift +4) //定位到文本行末尾
^(shift +6) //定位到文本行开头

x //删除当前字符
dd//将当前光标所在行进行剪切(删除)
ndd:从光标所在行开始删除n行 ,搭配p可进行剪切
X( shift+x):每按一次,删除光标所在位置的“前面”一个字符
nX :例如,「20X」表示删除光标所在位置的“前面”20个字符

shift + ~(shift按着不动,波浪号往后摁) //对单个字母进行大小写替换(自动替换,无需输入)
shift + r //转换成替换模式,无视当前内容进行覆盖替换,如果输错可以Backspace回退
r 某字母 //当前位置的字符替换成某个字符
nr 某字母 //当前位置开始的n个替换成某个字符

如果vim一个新的文件名,在wq(即保存退出后),也是可以创造一个新文件

b.底行模式

底行模式COMMAND
**在使用底行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。 **

set nu //设置行号
set nonu //取消设置行号
w:写入
q:退出

vs 文件名 //vim分屏操作,光标在哪个分屏,底行就是谁的
Ctrl ww //切换分屏,注意,这是底行模式的命令
! //不退出vim执行命令
eg:!ls -al
!man ls
!gcc -o test test.c等等

c.替换模式

shift + r 切换到替换模式
F12/insert 即可切换到替换模式,也可切换到插入/编辑模式

Linux编译器-gcc/g++的使用

gcc是专门用来编译C语言的编译器
g++是用来编译C/C++的编译器(因为C++兼容C)

gcc -v
g++ -v //查看版本

gcc是默认有的,如果g++没有的话sudo yum install -y gcc-c++

程序翻译的过程就是将文本的c转换成计算机二进制,因为计算机只认识二进制。原因是:计算机里的组件,无论是内存,cpu,磁盘。他们的物理介质只能表达两态。比如说触发器,内存,cpu内的寄存器这些的底层具有特定的硬件结构,最常见的是触发器,磁盘结构本身是一种电磁化的结构。既然磁化,就具有南极和北极(或者说是正负极)。所以说硬件只认识二进制,所以必须将代码变成二进制,才能跑起来。

gcc

编译链接其实有四个过程:预处理、编译、汇编、链接

预处理: 主要进行:
1.去注释 2.宏替换 3.头文件展开 4.条件编译 …
总的来说也就是去注释处理预处理指令

gcc -E test.c -o test.i
-E代表在预处理结束后停止,生成的是test.i文件
-o是我要指定一个新的名字
.i是Linux预处理完后生成的文件的文件后缀

进行预处理之后还是C语言

编译:主要是将C语言替换成汇编语言
其中还有语义分析,语法分析,词法分析,词义分析 ,符号汇总等等

gcc -S test.i (.c也可以)-o test.s
-S表示在编译完后停下,生成的是test.s文件
-o表示指定名字
.s是Linux编译完后生成的文件的文件后缀

汇编: 主要是将汇编语言替换成二进制语言和形成符号表
生成的是可重定向二进制目标文件(.o)

gcc -c test.s(.c .i都可以) -o test.o
-c表示在汇编完后停下,生成的是.o文件
-o表示重新制定一个名字
.o是Linux汇编完后生成的文件的文件后缀

链接: 多个可执行文件通过连接器合并生成一个可执行文件
并且包括形成段表和符号表的重定位

gcc test.o -o test
gcc test.c -o test
//直接gcc就是编译链接

g++同理

动静态库&&动静态链接

动静态库

ldd XXX //列出某文件动态库依赖关系
file XXX //Linux下并不是以后缀名来判断某个文件的类型的,因此我们可以用file来查看某个文件的类型

![image.png](https://img-blog.csdnimg.cn/img_convert/0b67539c9734345ff617670c7fd7c37b.png#clientId=u02a48189-ef6d-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=62&id=uf0ff101c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=78&originWidth=666&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7162&status=error&style=none&taskId=u61bbc8ef-e6cb-4ebc-8fa2-837f24e7afa&title=&width=532.8)
![image.png](https://img-blog.csdnimg.cn/img_convert/e4763594b1a3af469c0d7c89a5095a22.png#clientId=u03cd37aa-5ab4-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=160&id=u6004306e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=200&originWidth=1131&originalType=binary&ratio=1&rotation=0&showTitle=false&size=163191&status=error&style=none&taskId=u6319ea47-bfce-4c85-8176-986b6b2d7b0&title=&width=904.8)

一般链接的过程有两种方式
一种是动态链接,需要动态库
一种是静态链接,需要静态库

我们用ls /lib64就可以看到大量的动静态库比如调用printf函数,就是由这些动静态库提供的通过头文件找到方法的声明,再通过库找到方法的实现,再把我的代码和库里面的代码以某种方式联系起来,才形成了一个可执行程序

Linux:
.so (动态库)
.a (静态库)

Windows:
.dll (动态库)
.lib (静态库)

动静态链接

动态链接:**将库中需要的实现方法的地址,填入我的可执行程序中,建立关联
好处:节省资源
坏处:非常依赖库文件,如果不存在或缺失,程序无法运行

静态链接:**将库中方法的实现,拷贝到可执行程序中
好处:不再依赖库
坏处:占用资源

实操动静态链接

gcc、g++默认形成的可执行程序是动态链接的
![image.png](https://img-blog.csdnimg.cn/img_convert/4e7de18fec67aa011f1e47dcf91ef70a.png#clientId=u5719b337-0cd5-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=112&id=u7d3b8179&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=1065&originalType=binary&ratio=1&rotation=0&showTitle=false&size=115547&status=error&style=none&taskId=uff5cd259-7217-4287-a622-3af29e48821&title=&width=852)

gcc test.c -o test -static
-static 表明使用静态链接的方法形成可执行程序

云上服务默认只会添加动态库,需要自己安装静态库
sudo yum install libstdc++-static
sudo yum install glibc-static

![image.png](https://img-blog.csdnimg.cn/img_convert/6503abf2268b2cf909a9e26b9f0a8be0.png#clientId=u5719b337-0cd5-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=112&id=u5589e67e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=615&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54699&status=error&style=none&taskId=ueacfe19f-3c6d-4cec-89db-31353ba812c&title=&width=492)
由此可见,静态链接是非常占用资源的,而动态链接就占用的比较少

Linux项目自动化构建工具-make、Makefile

make是命令,Makefile是文件
make和makefile存在的意义就是自动化的帮我们构建项目
makefile文件的内容就是
a.依赖关系
b.依赖方法

![image.png](https://img-blog.csdnimg.cn/img_convert/b93262487a2907e9da5ae844a63f6d1c.png#clientId=u443baa58-c1a6-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=117&id=ucc45dff8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=146&originWidth=403&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42448&status=error&style=none&taskId=uc9a60b88-abb9-4170-93b8-307cd1b30f5&title=&width=322.4)
其中,test.c是依赖关系,gcc test.c -o mytest是依赖方法
.PHNOY:clean是伪目标
.PHONY是一个关键字,伪目标的特点是总是被执行(多次被执行)
![image.png](https://img-blog.csdnimg.cn/img_convert/ac75b93461fa2cd8ea5ee506cf909426.png#clientId=u443baa58-c1a6-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=446&id=udf0637a7&margin=%5Bobject%20Object%5D&name=image.png&originHeight=558&originWidth=648&originalType=binary&ratio=1&rotation=0&showTitle=false&size=247384&status=error&style=none&taskId=u5198a789-815e-4168-b141-d1c54b9587b&title=&width=518.4)
那么编译器是如何得知我的test是最新的呢?
之前的文章里我们就讲到了,ACM时间中的最近修改时间
编译器通过对生成的可执行程序的时间和源程序的时间作对比,如果可执行程序是最晚的,那么就是最新的
![image.png](https://img-blog.csdnimg.cn/img_convert/dccf364343efc0776510c65b0a5e935d.png#clientId=ue92c19db-694b-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&height=165&id=u026522ef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=206&originWidth=772&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17865&status=error&style=none&taskId=u557d3245-9ea0-46da-ab11-a740cdef118&title=&width=617.6)

A:access最近访问时间,修改也算是访问,并不是打开这个文件的时间
C: change最近修改的时间(属性的改变)
M: modify最近修改的时间(内容的改变)
文件=内容+属性
访问是一件高频的事件,如果说访问一次就修改一次,大大降低了效率,所以,Linux是累积一定时才去修改访问时间 .

多个源文件形成可执行程序
gcc -o mytest main.c test.c

Makefile文件

mytest:main.o test.o //(依赖关系列表)
gcc -o mytest main.o test .o//当自顶向下扫描找不到中和两个文件时,继续向下扫描(依赖方法)
main.o:main.c
gcc -c main.c -o main.o
test.o:test.c
gcc -c test.c -o test.o

.PHONY:clean //.PHONY为伪目标,总是被执行的
clean: //清理中的依赖关系
rm -rf *.o mytest //依赖方法

7I)U_K0KFO(5XYP~X5S(8P3.jpgU_K0KFO(5XYP~X5S(8P3.jpg&originHeight=78&originWidth=454&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9753&status=done&style=none&taskId=uc57af962-dc75-45bd-ab5d-fca076bd8e9&title=&width=363.2)
这个情况表示mytest已经是最新的文件了,不用再进行重新编译。如果想要每次执行,就将mytest放进伪目标PHONY中。这也证明了它总是被执行
image.png

进度条小程序

实现它之前,我们首先需要具备的基础知识是区分换行和回车
换行 \n
回车 \r
很多童鞋会以为二者并没有很大的区别,其实还是有点区别的
image.pngimage.png
但是我们平常使用换行的时候,也不是从上一行的结尾位置直接换到下一行开始打印,而是换到下一行的行首,这是因为这里默认\n为回车换行

再来看看两段代码

image.pngimage.png

思考以上两个代码的输出结果,第一个输出有换行,第二个输出没有换行
结果:第一个先打印"hello world",然后休眠3s
第二个先休眠,后打印出来"hello world"
为什么会出现这样的结果呢?按道理执行代码都是从上往下执行的,而两段代码中打印语句都在休眠函数的前面,那么为什么会出现第二种情况呢?
只有一个原因,第二段代码中printf语句早已执行完,只不过没有被立马显示出来。

原来c语言会给我们提供输出缓冲区,根据特定的刷新策略,来进行刷新。而显示器设备,一般的刷新策略是行刷新,碰到\n,就会把\n之前的所有字符全部显示出来。第二段代码没有遇到\n,所以字符没有立马显示出来。要想显示出来要加上 fflush(stdout);

image.png
加上后要打印的语句就会被立即显示出来
我们要实现进度条,是要在一行上不断输入一段字符串,并不是要换行打印,所以应该用\r,每一次打印完又回到行的最开始,且通过循环使每一次打印的字符串长度都不断增加,这样连续起来就会形成一个简单的进度条。
image.png

进度条源代码

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define Max 101
int main()
{
    char bar[Max];
    memset(bar,0,sizeof(bar));
    const char*lable="|/-\\";
    int count=0;
    while(count<=100)
  {
      printf("[%-100s][%d%%]%c\r",bar,count,lable[count%4]);
      bar[count++]='#';
      fflush(stdout);
      iusleep(30000);                                                      
  }
    printf("\n");
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_63601133/article/details/127155791

linux上的python开发工具_linuxpython开发工具,在linux下开发python使用什么工具好-爱代码爱编程

Linux里面什么python编辑器比较好 学习Python建议用以下开发工具,请根据自己的喜好,选择一种。 分2种 第一种是编辑器 1、vim 2、atom 3、sublime text 4、Visual Studio Code 第二种是python集成开发环境(ide) 1、pycharm python集成开发环境, 有免费版。

linux环境下安装keil,Linux下搭建STM32开发环境-爱代码爱编程

方案 最近在学习STM32单片机开发。我手头有一块开发板,开发板附带的教程中使用官方的固件库来开发软件,将MDK作为集成开发环境。MDK将代码编辑和工程构建全包了,这固然很方便,但是MDK的代码编辑功能较弱,而且MDK还是收费软件。于是便萌生了使用其他开发环境的想法。果然,有免费的高质量方案:GNU Toolchain + STM32CubeMX +

Linux C/C++ 开发环境搭建-爱代码爱编程

Linux C/C++ 开发环境搭建 文章目录 Linux C/C++ 开发环境搭建引言编译调试工具项目构建工具集成开发环境(IDE)Qt CreatorVisual Studio CodeCLion 引言 Windows 下 C/C++ 开发可以直接用宇宙第一 IDE Visual Studio;但是 Linux 下就不能用了 以 Ub

基于Linux服务器的JAVA开发环境搭建-爱代码爱编程

Linux服务器开发环境搭建 Linux安装Java一、使用yum查询JDK二、执行安装命令三、验证java是否安装成功四、安装开发环境Linux安装Nginx一、安装前环境检查二、下载Nginx压缩包linux系统上安装Mysql一、获取Mysql YUM源二、安装mysql源三、在线安装MySQL四、启动mysqlLinux安装Redis

嵌入式Linux开发工具-爱代码爱编程

一、文本编辑器    vi vim gedit gvim vim 可高度自定义,适合单个软件开发 二、编译器           gcc 三、库 四、调试器           gdb   资源占有少,免费开源,缺少图像显示,适合小程序开发 五、工程管理器    make(批量处理)自动化编译,提高开发效率   为什么使用要学Linux工具,它的

Linux环境搭建以及在Linux下做开发-爱代码爱编程

Linux的发行版本有很多,比如Ubuntu、Fedora 、 centos   web、 ArchLinux、红旗Linux   红帽Linux、Loki、Mint。本文主要讲解Ubuntu进行嵌入式软件开发。 一、Linux环境搭建 1.下载VMware  2.安装Ubuntu (要根据自己电脑配置合理搭建) 由于我使用的是免安装版,大家可以

Linux环境基础开发工具的使用-爱代码爱编程

文章目录 Linux 软件包管理器 yum什么是软件包查看软件包安装软件卸载软件Linux编辑器 - vimvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集Linux编译器-gcc/g++背景知识gcc/g++的编译预处理编译汇编链接静态库和动态库gcc选项Linux调试器 - gdb背景知识gdb命令汇总Linux项目自动

【Linux】linux环境基础开发工具使用-爱代码爱编程

目录 一、调试器gdb 1、可以使用gdb的可执行文件生成 2、使用命令 1、开始调试和退出调试 2、list 3、类比vs调试 4、代码调试“三剑客” 5、变量 6、断点 二、Linux项目自动化构建工具make/Makefile 1、make和Makefile分别是什么? 2、依赖关系和依赖方法 3、生成方案和清理方案 4、

Linux开发工具vim以及git的使用详解-爱代码爱编程

Linux开发工具 文章目录 Linux开发工具vim的基本概念与操作命令模式常见命令复制与粘贴文本修改替换删除光标定位底行模式常见命令批量化替换vim配置vim配置文件位置vim的环境设置参数Linux编译器-gcc/g++使用动态链接和静态链接gdb的使用背景开始使用进入gdb退出gdb调试命令自动化构建工具-make/Makefile背景什

linux安装开发工具-爱代码爱编程

linux安装开发工具 1.安装jdk 首先百度网盘搜过下载linux版本的jdk,速度快,官网下载比较缓慢 1.查询是否以前安装过jdk rpm -qa|grep java 2.查询相应的安装文件夹 whereis java 3.在/usr/目录下创建java目录, mkdir /usr/local/java

Linux环境基础开发工具使用(2)-爱代码爱编程

Linux环境基础开发工具使用(2) Linux编译器--gcc/g++基础使用 一.gcc的使用 gcc file_name(文件名) 就可以直接编译了 运行程序就是 ./a.out(也可以用绝对路径 方式运行) gcc -E(预处理) file_name 预处理核心工作:进行头文件展开,去注释,条件编译,宏替换等等 -E 就是

喵呜:【Linux环境基础开发工具使用篇之Linux开发工具】:Linux编译器-gcc/g++使用-爱代码爱编程

文章目录 一、背景知识基础知识链接二、gcc如何完成1.预处理(进行宏替换)2.编译(生成汇编)3.汇编(生成机器可识别代码)4.连接(生成可执行文件或库文件)在这里涉及到一个重要的概念:函数库函数库一般分为静态库和动态库两种。gcc编译如何使用静态库静态库下载:gcc 编译时使用动态库生成可执行文件与gcc 编译时使用静态库生成可执行文件对比

[Linux]常见环境开发工具-爱代码爱编程

●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。 📌📌📌为您导航📌📌📌 1.Linux 软件包管理器 yum1.1什么是软件包1.2Linux下怎么安装/卸载软件2.vim2.1vim命令模式常见命令

Linux初阶:基本开发工具-爱代码爱编程

基础开发 Windows 下有例如 Visual Studio、IDEA 这样的集编写代码、编译代码、调试代码、运行代码、代码关系维护以及各种各样的复杂功能于一身的开发工具,叫做集成开发环境 IDE。Linux 下一般使用代码编辑工具 vi/vim,编译工具 gcc/g++,调试工具 gdb。 1. 编辑工具 vim Linux 下编写代码

Linux环境基础开发工具使用(1)-爱代码爱编程

文章目录 Linux环境基础开发工具使用(1)一.Linux软件包管理器yum二.Linux开发工具Linux编辑器--vim使用vim的简单配置(以及添加信任关系) Linux环境基础开发工具使用(1) 一.Linux软件包管理器yum 软件安装方式 源码安装rpm安装 (类似于安装包)yum 安装 (本身会考虑依赖关系)

linux应用程序开发指南-开发工具介绍-爱代码爱编程

概述: 由于目前国产桌面操作系统都是以linux内核为基础开发的,因此国产桌面操作系统应用程序开发实际上就是在linux系统上进行应用开发。当前软件种类繁多,应用场景可以说无所不在,软件种类虽多,但目前我们软件开发环境主要还是windows系统和linux系统环境两类,除了Qt这种跨平台软件在windows和linux系统上都有相同的开发环境外,linu

linux 中如何使用 id 命令_奋斗的工程师的博客-爱代码爱编程

Linux 中如何使用 id 命令 我从cnaaa.com购买了服务器。 在 Linux 中,id 命令用于显示用户的真实有效的用户ID和组ID。 本文我们通过一些例子来介绍一下如何使用 id 命令。 Linux 中

喵呜:【linux环境基础开发工具使用篇之linux开发工具】:linux调试器-爱代码爱编程

文章目录 一、 背景二、开始使用 一、 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb