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

相关推荐
项目申报小狂人10 分钟前
中科院1区SCI-哲学命题优化算法Philosophical proposition optimizer-附Matlab免费代码
linux·算法·matlab
济61711 分钟前
linux 系统移植(第二十期)---- BusyBox构建根文件系统---- Ubuntu20.04
linux·嵌入式硬件
callJJ19 分钟前
Docker 代码沙箱与容器池技术详解
java·运维·docker·容器·oj系统·代码沙箱
电气铺二表姐1377441661522 分钟前
微电网能量管理系统(EMS)-光储充协同优化,提升能源利用率
运维·能源
开开心心就好22 分钟前
免费抽奖工具支持批量导入+自定义主题
linux·运维·服务器·macos·pdf·phpstorm·1024程序员节
刘叨叨趣味运维22 分钟前
docker镜像构建优化与安全核心要点
运维·docker·容器
名誉寒冰27 分钟前
Linux 网络内核:tcp_transmit_skb 与 udp_sendmsg 解析
linux·网络·tcp/ip
GHL28427109028 分钟前
*:端口 & 127.0.0.1:端口
运维·服务器·c++
John Song29 分钟前
miniconda是否初始化?
linux·运维·服务器·python
草草_37 分钟前
【内核驱动基础】内核模块的两种编译方式(in-tree vs out-of-tree)
linux·驱动开发·内核