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

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

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 结尾的文件

相关推荐
ICscholar1 天前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim20201 天前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
薛定谔的猫19821 天前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子1 天前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪1 天前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld1 天前
Linux ssh端口转发
linux·ssh
昨夜见军贴06161 天前
IACheck AI审核如何实现自动化来料证书报告审核,全面提升生产效率与合规水平
运维·人工智能·自动化
知识分享小能手1 天前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
浩子智控1 天前
电子产品设计企业知识管理
运维·服务器·eclipse·系统安全·硬件工程
Xの哲學1 天前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算