🌻个人主页:路飞雪吖~
🌠专栏:Linux
目录
一、Linux开发工具
🌟vim的基本概念
二、Linux编译器-gcc/g++使用
🌟gcc如何完成(ESc - iso)
1、预处理(进行宏替换)
2、编译(生成汇编)
3、汇编(生成机器可识别代码)
4、连接(生成可执行文件或库文件)
编辑
🌠库函数
三、Linux项目自动化构建工具-make/Makefile
🌟是什么?
🌟语法
⭐形成可执行:
⭐清理项目:
⭐make/makefile基本原理:
🌠小贴士:
🌠语法
一、Linux开发工具
🌟vim的基本概念
vim是一个多模式编辑器。
vim常见模式:
• 正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
• 插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
• 末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入
:help vim-modes
在命令模式进行的操作:
光标所在行 | 光标快速定位 | ||
复制:yy n+yy | 文本结尾:shift+g=G | 行尾:shift+4=$ | 光标位置向后按照字符进行删除:n+x |
粘贴:p,n+p | 文本开始: gg | 行首:shift+6=^ | 光标位置向前: shift+x = X |
撤销:u | 文本任意一行:n,shift+g | 以单词为单位,向后跳转: w | 大小写快速切换: shift+~ |
剪切:dd,n+dd | 光标局部定位: h(左),j(下),k(上),l(右) | 以单词为单位,向前跳转: b | 替换字符: n+r |
在底行模式:
底行模式 | |
显示文件行数: :set nu | 保存并退出: :wq! |
查找关键字: :/关键词 | 在vim里进行操作: :!ls -al |
多屏打开文件: :vs filename | 多屏光标切换: :ctrl+ww 左/右键 |
直接退出: ctrl + zz |
在视图模式:ctrl+v
多行注释:
视图模式 | 允许光标进行批量化选择 |
1、ctrl+v | 进入visual BLock |
2、h/j /k/l (光标定位) | 进行区域选择 |
3、 shift+i | |
4、 // | |
5、按两次 Esc |
取消注释:
ctr+v |
h/j /k/l (光标定位) |
d |
二、Linux编译器-gcc/g++使用
🌟gcc如何完成(ESc - iso)
写的代码是如何变成可执行文件的?
1、预处理(进行宏替换)
• 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
• 预处理指令是以#号开头的代码行。
预处理完之后还是C语言,只不过是处理的比较干净的C语言代码。
gcc -E code.c -o code.i
• -E 开始进行程序的翻译,预处理做完就停下来;
• -o 指目标文件;
• ".i " 文件为已经过预处理的C原始程序 。
2、编译(生成汇编)
把代码翻译成汇编代码。
• 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
• 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
gcc -S code.i -o code.s
• -S 开始进行程序的编译,编译完就停下来;
3、汇编(生成机器可识别代码)
• 汇编阶段是把编译阶段生成的“.s”文件转成目标文件;
• 在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
gcc -c code.c -o code.o
• 开始进行程序的翻译,汇编完成就停下
• 形成 code.o 可重定位目标文件
4、连接(生成可执行文件或库文件)
• 在成功编译之后,就进入了链接阶段。
gcc -o code code.o
• code.o 目标文件和标准库进行关联,构建可执行程序。
• code 编译出来的文件名,code.o 要编译的文件
🌠小贴士:
连接方式分为动态链接和静态链接。
🌠库函数
ldd 可执行程序的名字
表示这个可执行程序,自己在链接时依赖哪些库。
<1> 静态库
• XX.a (linux)、XX.lib (windows)
• 静态链接:把我们要访问的方法实现,拷贝到我们自己的可执行程序中;
• 比较浪费资源,可执行程序体积比较大;
• 不依赖其他库,库丢失也无所谓,程序照样能运行。
<2> 动态库
• XX.so (linux)、XX.dll (windows)
• 一旦动态库缺失,所有程序无法运行;
• 比较节省资源,可执行程序体积小;
<3> 要进行动态链接必须要有动态库,要进行静态链接必须要有静态库。
三、Linux项目自动化构建工具-make/Makefile
🌟是什么?
make :是一条命令
makefile:是一个文件
make和makefile组合是一个帮助我们自动化构建项目的一个工具。
🌟语法
⭐形成可执行:
makefile本质是依赖关系和依赖方法的集合。
依赖关系:我和爸爸的关系
依赖方法:我跟爸爸提的要求
proc : proc.c
目标文件 :依赖关系 列表
⭐清理项目:
proc:proc.c
gcc -o proc proc.c
.PHONY:clean
clean:
rm -f proc
⭐make/makefile基本原理:
🎉 makefile文件,会被make从上到下开始扫描,第一个目标名,是缺省要形成的。如果我们想要执行其他组的依赖关系和依赖方法就 make name
• 依赖方法可以是任意指令;
• @ 关闭命令回显
🎉 makefile在执行gcc命令时,如果发生了语法错误,就会终止推导过程。
🌠小贴士:
<1> .PHONY的作用是什么?
.PHONY:让目标文件,对应的方法,总是被执行的!
<2> 当源文件修改了之后,就可以重新编译:
有时候需要重新编译,又时候不需要,为什么?
对于 源文件 和 可执行程序 ,都是文件,文件 = 内容 + 属性。
属性:文件的大小,文件创建的时间
AMC时间:
A:表示这个文件最近被访问的时间
M:最近内容被修改的时间
C:最近属性被改变的时间当修改内容的时候,可能会引发属性的联动(文件的新增,大小就会改变,大小就是文件的属性):
为了效率,Access时间,不是每一次刷新,而是积累一定次数才会刷新。
回到刚才的问题:有时候需要重新编译,有时候不需要,为什么?
根据对比文件各自的 Modify 时间 做到的!
根据源文件和可执行程序谁的时间更加新,来决定的!
可执行程序更加新,不需要重新编译,
源文件更加新,需要重新编译。
以上总结: .PHONY 是让依赖方法,忽略掉时间对比,所以能总是被执行!
🎉 make解释makefile的时候,是会自动推导的。
一直推到,推导过程,不执行依赖方法。
直到推到到有依赖文件存在,然后在逆向的执行所有的依赖方法。
🌠语法
<1>
% 为makefile语法中的通配符;
%.c : 当前目录下所有的 .c 文件,展开到依赖列表中;
$< : 依赖关系:右侧的依赖文件,一个一个的交给gcc -c选项,形成同名的 .o 文件
<2>
$(bin) : $(src)
目标文件:依赖关系列表
makefile中也可以定义变量,没有类型。
$() :把变量的内容替换进来
$^ : 所有的依赖文件列表【$(src)】的所有内容,一次性全部给gcc
$@ : 目标文件,要形成的目标文件
<3> make默认只形成一个可执行程序。
如何一次形成多个可执行程序?
如若对你有帮助,记得点赞、收藏、关注哦!
若有误,望各位,在评论区留言或者私信我 指点迷津!!!谢谢^ ^ ~