Linux:编译,调试和Makefile

一丶vim编译器

### 基本概念


模式:Vim有几种不同的模式,包括:


命令/正常/普通模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式:只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁 的编辑模式。

末行/底行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模 式。要查看你的所有模式:打开vim,底行模式直接输入

###基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

$ vim test.c 不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文 字。

[正常模式]切换至[插入模式]

输入a    输入i   输入o

[插入模式]切换至[正常模式]

目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可 以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。

[正常模式]切换至[末行模式] 「shift + ;」, 其实就是输入「:」 退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:

: w (保存当前文件): wq (输入「wq」,存盘并退出vim) : q! (输入q!,不存盘强制退出vim)

注意:底行模式和插入模式无法直接切换

###命令模式命令集

光标移动

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、 「l」,分别控制光标左、下、上、右移一格 按

「G」:移动到文章的最后

按「 $ 」:移动到光标所在行的“行尾”

按「^」:移动到光标所在行的“行首”

按「w」:光标跳到下个字的开头

按「e」:光标跳到下个字的字尾

按「b」:光标回到上个字的开头

按「n l」:光标移到该行的第n个位置,如:5 l,56 l

按[gg]:进入到文本开始

按[shift+g]:进入文本末端 按「ctrl」+「b」:屏幕往“后”移动一页

按「ctrl」+「f」:屏幕往“前”移动一页

按「ctrl」+「u」:屏幕往“后”移动半页

按「ctrl」+「d」:屏幕往“前”移动半页

删除文字

「x」:每按一次,删除光标所在位置的一个字符

「n x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符

「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符 「n X」:例如,「20X」表示删除光标所在位置的“前面”20个字符

「dd」:删除光标所在行 「n dd」:从光标所在行开始删除#行

复制

「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

「n yw」:复制#个字到缓冲区

「yy」:复制光标所在行到缓冲区。

「n yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完 成复制与粘贴功能。

替换

「r」:替换光标所在处的字符。

「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

撤销上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回 复。

「ctrl + r」: 撤销的恢复,撤销上一次撤销。

更改 「cw」:更改光标所在处的字到字尾处

「c n w」:例如,「c3w」表示更改3个字

跳至指定的行

「ctrl」+「g」列出光标所在行的行号。

「nG」:例如,「15G」,表示移动光标至文章的第15行行首

###vim末行模式命令集

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

列出行号 「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。

跳到文件中的某一行 「n」

:「n」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15, 再回车,就会跳到文章的第15行。

查找字符 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直 按「n」会往前寻找到您要的关键字为止。 

保存文件 「w」: 在冒号输入字母「w」就可以将文件保存起来

离开vim 「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。 「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

       vim最后声明:Linux刚开始使用vim编译器使用起来感觉不如vs等编译器,可以搜索相关资料配置vim。

二丶gcc / g++

      这里只讲方法

 ###使用GCC编译源代码

      在终端中,使用以下命令编译hello.c

gcc hello.c -o hello

      这里,-o选项用于指定输出文件的名称。

###GCC编译链接过程

1. 预处理(Preprocessing)

      预处理阶段主要处理源代码中的宏定义、条件编译指令等。使用以下命令查看预处理后的代码:

gcc -E hello.c -o hello.i
2. 编译(Compilation)

      编译阶段将预处理后的代码转换为汇编代码。使用以下命令进行编译:

gcc -S hello.i -o hello.s
3. 汇编(Assembly)

       汇编阶段将汇编代码转换为机器代码。使用以下命令进行汇编:

gcc -c hello.s -o hello.o
4. 链接(Linking)

       链接阶段将编译生成的目标文件与库文件进行合并,生成可执行文件。在我们的例子中,使用以下命令进行链接:

gcc hello.o -o hello

        实际上,在第一步编译源代码时,GCC已经自动完成了预处理、编译、汇编和链接的过程。以上步骤只是为了说明编译链接的整个过程。

gcc 和 g++ 在这个过程几乎一样,差别也是细微的关于库那方面的差别

三丶调试:gdb

背景

程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

开始使用 gdb File 退出: ctrl + d 或 quit     

调试命令:

list/l 行号:显示File源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

finish:执行到当前函数返回,然后挺下来等待命令

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数 

p 变量:打印变量值。

set var:修改变量的值

continue(或c):从当前位置开始连续而非单步执行程序

run(或r):从开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

until X行号:跳至X行

breaktrace(或bt):查看各级函数调用及参数

info(i) locals:查看当前栈帧局部变量的值

quit:退出gdb

四丶Makefile

背景

        一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。

       make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

###vim makefile

看图还是比较明了的,依赖文件列表也可以为空,就像clean一样,.PHONY 就像一个声明一样。

### make 和 make clean

       从上往下依次看,我们这个目录中只有makefile 和 一些源文件,先执行make命令,然后系统自动执行了g++命令,再看目录下的文件,多出来 .exe文件,并且可以执行,当我们再次执行make命令时被系统告知,.exe文件是最新的,因为如果每次执行make命令都编译一次没有修改的代码并且这些代码很长,源文件很多,就会很浪费时间和空间。

       紧接着我们执行了make clean命令,这里加上clean是因为make命令在读取makefile文件的时候默认从上往下读,不会执行makefile里面的所有的命令,写在前面的make就默认执行。同时注意,我们执行了多次make clean 命令,系统并没有警告,这就跟上面所说的.PHONY 有关了。

       这张图中,$@  和  $^  其中$ 符号默认,@代表标文件 myproject.exe,^代表所有的依赖文件,文件太多不想写可用。

       接下来我们可以看到makefile中一系列的目标文件,依赖文件和依赖关系,我们按照编译链接的逻辑将一整个g++ 流程拆分成 -E  -S  -c  得到 .i  .s .o 文件,上面提到make指令从上往下读取,但在这里make指令是按顺序执行代码,实际上是make找到了.exe 需要 .o ,然后向下找 .o 发现 .o文件没用生成,就继续执行,找到了可以生成.o 文件的 .s 文件,继续向下找需要的文件,执行完成后返回上一个文件继续执行,这个过程跟栈可以说是一模一样。

###最后的makfefile

  1 bin=myproject.exe2 src=myproject.cpp3 4 $(bin):$(src)5     g++ -o $@ $^6 7 .PHONY:clean8 clean:9     rm -f $(bin) 

       在makefile中可以定义变量,$ 是从bin 或者 src中提取内容 ,感觉就像指针和解引用一样,定义变量时等号两边最近的两个变量不可有空格,src可以跟多个cpp(或其他)变量,空格隔开,这种写法还是比较简单易懂的。

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

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

相关文章

【Vision Transformer】辅助理解笔记

注:本文主要是对 PPT 部分内容的补充与拓展,建议结合使用(当然也完全可以单看)。 一、基础知识 1、从向量表示到词嵌入 这部分主要是参考如下文章,大部分图片均来自此文:The Illustrated Word2vec – Jay…

visio 2021入门直通车(一天全搞定)

安装Visio 2021 (64bit)安装教程 1.1. 模板类型 1.2. 界面布局 1.3. 插入对象 1.4. 添加页面 1.5. 全屏演示|页面自适应|visio文件切换 1.6. 快捷键 快捷键说明 Shift 鼠标滚轮 按下shift,点击鼠标滚轮水平页面滚动 鼠标滚轮 垂直页面滚动 Ctrl 鼠标滚轮 按…

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie,然后让后台最…

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览,而且支持用户USB接口连接,同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项,能够帮助摄影师优化相机的性能&…

Redis技术解析(基础篇)

1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 Redis-server NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至jso…

ad14转cadence17.4

一、原理图转换 将原理图文件拖入到新建工程中

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天,云原生 AI 20场主题分享,三展互动,为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接) 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖:2.applic…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢? 解决方案? 5、指令重排序…

精密制造与质量控制:保障滚珠丝杆重载运行精度

滚珠丝杆作为精密机械传动领域的重要零部件,能够将旋转动力精准地转化为流畅的直线运动。在数控机床、精密制造及高度自动化生产线上扮演着不可或缺的角色。在应对温度波动、负载突变及严苛环境条件的考验中,都有很好的表现。那么,应该如何确…

【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 JUC是“Java Util Concurrency”的缩写,指的是Java并发工具包,它位于java.util.concurrent包及其子包中。JUC包提供了大量用于构建并发应用程序的工具和…

深入解析Python 中的 sortedcontainers 库:高效的排序数据结构

在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问…

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开,有两种方式 (1)需要将文件关闭,再用非阻塞方式打开 (2)fctnl函数,先获取旧属性,再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…

从更底层的角度理解网站的访问过程

文章目录 1.示例,访问www.baidu.com是如何返回数据的1.输入www.baidu.com回车2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件夹下有没有这个域名对应的映射: 1.示例,访问www.baidu.com是如何返回数据的 1.输入www.baidu.com回车…

开源数据集网站合集

一.Google数据集 链接:https://datasetsearch.research.google.com/ 二.Huggingface数据集 链接1:GitHub - huggingface/datasets: 🤗 The largest hub of ready-to-use datasets for ML models with fast, easy-to-use and efficient dat…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要,而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理,以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP,全称超文本传输协议&#xf…

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算,光转换成电信号时,由于动脉对光的吸收有变化而其他组织对光的吸收基本不变,得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号,就能反应出血液流动的特点。这种技术叫做光电容积脉搏…

如何查看线程

1、首先找到我们的电脑安装jdk的位置,这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok,那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程: jconsole 这里能够罗列出你系统上的 java 进程&#xff0…

[Linux] Linux操作系统 进程的状态

标题:[Linux] Linux操作系统 进程的状态 个人主页:水墨不写bug (图片来源于网络) 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始: 在校的时候,你一定学过《…

java 框架组件

Java 框架是一系列预先编写好的、可复用的软件组件,它们旨在帮助开发者快速构建高质量的应用程序。Java 社区拥有众多优秀的框架,涵盖了从 Web 开发到大数据处理的各个领域。下面是一些流行的 Java 框架及其主要用途: Spring框架:…