Linux——简单认识vim、gcc以及make/Makefile

ops/2024/11/13 23:14:59/

前言大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。

1、vim操作:

默认打开vim时,vim处于命令模式。(在其他模式中,Esc就能够返回命令模式)

常用的命令有:

n + gg:跳转到n行,没有n就跳转到首行

n + shift + g:跳转到n行,没有n就跳转到末行

shift+4:光标定位到行尾

shift+6:光标定位到行首

yy:复制当前行

n+p:粘贴到下n行,没有n就粘贴以行

n+dd:剪切or删除下n行,没有n就剪切一行

shift+~:大小写快速切换

n+r:小范围文本替换,n个文本全部替换为统一字符

shift+r:进入替换模式,替换模式是一个新的模式,可以Esc退出到命令模式

u:撤销命令,相当于 ctrl+z

ctrl+u:对撤销命令进行撤销

shift+zz:保存并退出vim

crtr + v ->hjkl -> shift + i -> // -> Esc :批量化注释

ctrl + v ->hjkl -> d :批量化去注释

早期的键盘没有上下左右,因此在命令模式下:

h <-> 向左

l  <-> 向右

j  <-> 向下

k <-> 向上

shift + ;  <->  进入底行模式

w <-> 保存

q <-> 退出

set nu <-> 显示每一行行号

2 、gcc/g++

gcc 👉:只用来编译C

g++ 👉:能够编译C和C++

代码从 .c 到执行的过程:

        Ⅰ:预处理(进行宏替换、去注释、条件编译、头文件展开)

                对应指令:gcc -E test.c -o test.i

                文件后缀 .c → .i

        Ⅱ:编译(生成汇编)

                对应指令:gcc -S test.i -o test.s

                文件后缀 .i → .s

        Ⅲ:汇编(生成机器可以识别的代码)

                对应指令:gcc -c test.s -o test.o

                文件后缀 .s → .o

        Ⅳ:链接(生成可执行文件或库文件)

                .o 文件与库文件进行链接 -> 可执行程序

补足一些这方面的常识:

        问:为什么要进行编译?为什么要汇编?为什么不跳过这些步骤,让代码直接变成可执行程序?

        答:因为从历史的角度出发,先有二进制编程,再有编译器,再有汇编语言,再到C/C++这样的其他语言,我们站在巨人的肩膀上,企业家为了节省语言的开发成本,因此需要遵循前人的步伐。

        问:什么是编译器自举?

        答:前面提到,从历史角度出发,先有二进制编程,再有汇编,为了能够让二进制代码变成汇编代码,需要二进制编译器进行转换,通过二进制编译器编译汇编语言所写的软件。随着技术的发展,后来就用汇编语言所写的编译器编译汇编语言所写的软件,这一过程就称之为编译器自举

3、动静态库和动静态链接

1.动静态库:

Linux环境下:

👉:动态库为 → libXXX.so     XXX为库的名称

👉:静态库为 → libXXX.a       

Windows环境下:

👉:动态库为 → xxx.dll          XXX为库的名称

👉:静态库为 → xxx.lib 

2.动静态链接:

Linux环境下:

👉:动态链接指令:gcc test.o -o mytest    (将二进制代码 test.o 转化为可执行程序 mytest)

👉:静态链接指令:gcc test.o -o mytest -static

动态链接和静态链接的区别:

👉:动态链接会将库的地址拷贝到内存中,编译器(连接器)会通过寻址的方式,将可执行程  序与动态库链接起来,动态库不在内存当中。动态库不能丢失,一旦丢失所有依赖动态库的程序都会出错。

👉:静态链接会将库方法直接拷贝到可执行程序当中

4、自动化构建-make/Makefile

make/Makefile 是什么?

         make 👉:指令

         Makefile 👉:文件

make/Makefile 的核心思想?

        👉:通过依赖关系和依赖方法形成目标文件

make/Makefile 具体语法?

        假设现有文件 code.c以及Makefile

        

        Makefile内部语法如下图所示:

        

        注:

        ①:code.c 与 mycode 建立依赖关系,而 gcc code.c -o mycode 为依赖方法,通过该串指令,生成 code.c 代码的可执行程序

        

        

        ②:.PHONY→伪目标,clean能够被多次执行,但同样的code.c只能被执行一次

        

        

        ③:只有当我们对code.c文件进行修改时,make会对比源文件和可执行文件的修改时间,若前后时间被修改过,那么能够再次执行make (时间一共有三个,对比的Modify时间)

        

make/Makefile执行过程:

        倘若目录里没有code.o,Makefile会将该方法入栈,并去寻找code.o依赖谁,直至找到当前目录中存在的依赖关系为止,并执行依赖方法。然后再执行栈中的依赖方法,并出栈,直至完成所有依赖方法

        

make/Makefile 更加通用的语法:

👉:前五行可以视为C中的宏定义,$(宏定义) 即可使用

👉:$(shell ls *.c) 取当前目录中所有 .c 后缀的文件   还有一种表示方法为:$(wildcard *.c)

👉:&(SRC:.c=.o)将当前目录中所有 .c 后缀的文件转为 .o 后缀的文件

👉:@去回响,Makefile 每当执行一个依赖方法时,都会把依赖方法打印出来,加了@就不会打印

👉:$^  <-> 依赖对象(OBJ) 

        $@ <-> 被依赖对象(BIN)

        

👉:%.c <-> 匹配任意以 .c 结尾的文件 

        $<    <-> 将所有.c 结尾的文件一个一个的转换成 .o 结尾的文件


http://www.ppmy.cn/ops/133049.html

相关文章

Mysql COUNT() 函数详解

Mysql COUNT 函数详解 COUNT() 的几种用法COUNT(*)COUNT(1)COUNT(column)COUNT(*) 与 GROUP BYCOUNT(*) 与 GROUP BY 和 HAVING COUNT(expr) 的用法COUNT(DISTINCT expr)COUNT(expr) 带条件查询 写在最后 在使用Mysql的时候&#xff0c;作为开发者&#xff0c;聚合函数是肯定会…

第三十六章 Vue之路由重定向/404页面设置/路径模式设置

目录 一、路由重定向 1.1. 使用方式 1.2. 完整代码 1.2.1. main.js 1.2.2. App.vue 1.2.3. index.js 1.2.4. Search.vue 1.2.5. Home.vue 1.3. 运行效果 二、设定404错误页面 2.1. 使用方式 2.2. 完整代码 2.2.1. index.js 2.2.2. NotFound.vue 2.2.3. 运行效…

[每周一更]-(第122期):模拟面试|数据库面试思路解析

10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树? 为什么 MySQL 用 B+ 树而不用 B 树? 什么是覆盖索引? 什么是聚簇索引/非聚簇索引? 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引? 什么回表?如何避免回表? 树的高度和查询性能是什么关系? 什么是索引最左…

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: RabbitMQ的使用场景有哪些? 我回答: RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它遵循高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ的核心作用是作为应用程序之间的中介&#xff0c;实现异步消息传递。它…

【系统架构设计师-2024下半年真题】案例分析-参考答案及部分详解(完整回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 材料一【问题1】(14分)【问题2】(11分)材料二【问题1】(10分)【问题2】(6分)【问题3】(9分)材料三【问题1】(13分)【问题2 】(8分)【问题3 】(7分)材料四【问题1】(6分)【问题2】(12分)【问题3…

SpringBoot赋能的共享汽车业务管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

数值优化 | 图解牛顿法、阻尼牛顿法与高斯牛顿法(附案例分析与Python实现)

目录 0 专栏介绍1 引例2 牛顿迭代法3 阻尼牛顿法4 高斯牛顿法5 案例分析与Python实现5.1 牛顿法实现5.2 阻尼牛顿法实现5.3 高斯牛顿法实现5.4 案例分析 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实…