一、vi编辑器之神
1.vi编辑器的三种模式:
插入模式:可以编辑文档
编辑模式:可以敲一些命令,执行例如复制n行 剪切n行 ,粘贴等功能
命令模式:(最后一行模式)
在此模式下可以保存文件,退出vi等
2.vi的三种模式之间的切换:
由编辑模式进去插入模式,按a i o这几个字母
由插入模式进入编辑模式,按ESC键
只能由编辑模式才能进入最后一行模式,在编辑模式下按shift : 进入最后一行模式
3.在最后一行模式下的命令
:w 保存文件
:wq 保存文件并退出
:x 保存文件并退出
:q! 不保存文件,强制退出vi
:w filrname 另存为filename
总结:
由插入模式或命令模式(最后一行模式)进入编辑模式 方法是按ESC键
由编辑模式进命令模式(最后一行模式)按shift:
由编辑模式进插入模式 按 a i o
插入模式和命令模式(最后一行模式)不能直接切换
4.编辑模式下的操作:
u 撤销前面多次修改, ctrl r 反撤销
[n]x 删除光标前n个字符 3x
[n]X 删除光标前n个字符 6X
[n]dd删除从当前行开始的n行 4dd
[n]yy复制从当前行开始的n行 4yy
p把粘贴板上的内容插入当前行
.执行上一次操作
shift +zz(按住shift按两下z键保存退出当前文件
5.编辑器模式下的光标移动
[n]G:将光标定位到第n行开始处
5G:将光标移动到第5行开始处
G:将光标定位到文件结束处
gg:将光标定位到文件开始处
6.编辑模式下查找:
/字符串:从光标开始处向文件尾查找字符串
n:同一方向重复上一次查找命令
N:反方向重复上一次查找命令
二、Makefile
1.什么是make?
make 是个命令,是个可执行程序,用来解析Makefile文件的命令
2.什么是makefile?
makefile是个文件,这个文件中描述了咱们程序的编译规则
咱们执行make命令的时候,make命令会在当前目录下找makefile文件
根据makefile文件里的规则,编译咱们程序
注意:Makefile规则文件是咱们程序员根据自己的程序,编写的编译规则
3.采用Makefile的好处
- 简化编译程序的时候输出的命令,编译的时候只需要敲make命令就可以了
- 可以节省编译的时间,提高编译效率。(通过make编译过一次后,当你下次再编译的时候,只会编译修改过时间戳的文件,没有修改的文件不会重新编译)
4.make的概述
- GNU make是一种代码工具
- make工具会根据makefile文件定义的规则和步骤,完成整个项目的代码维护工作
- 一般用来简化编译工作,可以极大地提高软件开发的效率
- windows下一般由集成开发环境自动生成
- linux需要由我们按照其语法自己编写
make主要解决两个问题:
- 大量代码的关系维护
大项目中源码比较多,手工维护,编译时间长而且编译命令复杂,难以记忆及维护
把代码维护命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译
- 减少重复编译时间
在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间。
5.makefile语法及其执行
目标:依赖文件列表
<Tab>命令列表
01.目标
通常是要产生的文件名称,目标可以是可执行文件或其他obj文件,也可以是一个动作的名称
02.依赖文件
是用来输入从而产生目标的文件
一个目标通常有几个依赖文件(可以没有)
03.命令:
make执行的动作,一个规则可以包含几个命令(可以没有)
有多个命令时,每个命令占一行
简单示例:
make命令格式:
make [-f file] [targets]
- [-f file]:
make默认在工作目录路径中寻找FGNUmakefile、makefile、Makefile的文件作为makefile输入文件,-f可以指定以上名字以外的文件作为makefile上输入文件。
- [targets]
若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用 空格隔开)。
一般使用的时候直接make就可以
6.Makefile案例:
- main.c
#include "head.h"
int main(int argc,const char *argv[])
{
int x = 1000;
int y = 900;
printf("%d + %d = %d\n",x,y,sum(x,y));
printf("%d + %d = %d\n",x,y,sub(x,y));
return 0;
}
- head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#include<stdio.h>
int sum(int a,int b);
int sub(int a,int b);
#endif
- sum.c
#include "head.h"
int sum(int a,int b)
{
return a + b;
}
- sub.c
#include "head.h"
int sum(int a,int b)
{
return a - b;
}
模拟多文件编程,基本上一个文件一个功能.如果没有makefile可以使用gcc *.c进行编译,但是如果工程特别大,编译全部文件就会很浪费时间。采用makfile可以提高效率.
- makefile
main:main.o sub.o sum.o
gcc main.o sub.o sum.o -o main
main.o:main.c
gcc -c main.c -o main.o
sub.o:sub.c
gcc -c sub.c -o sub.o
sum.o:sum.c
gcc -c sum.c -o sum.o
clean:
rm *.o main a.out -rf
- make编译
7.假想目标
前面makefile中出现的文件称之为假想目标
假想目标并 不是一个真正的文件名,通常是一个目标集合或者动作
可以没有依赖或者命令
一般需要显示的使用make+名字 显示调用
all:exec1 exec2
clean:
<Tab>rm *.o exec
运行时使用make clean就会执行clean后面的命令
8.makefile变量概述
makefile变量类似于C语言中的宏,当makefile被make工具解析时,其中的变量会被展开。
变量的作用:
保存文件名列表
保存文件目录列表
保存编译器名
保存编译参数
保存编译的输出
9.makefile的 变量分类
01.自定义变量
定义变量:
变量名=变量值
引用变量:
$(变量名)或${变量名}
makefile的变量名可以以数字开头:
注意:变量还是大小写敏感的
变量一般都在makefile的头部定义
变量几乎可在makefile的任何地方使用
如何编写自定义变量:
在makefile中可以用“#”注释
采用自定义变量后的makefile文件
编译结果:
02系统环境变量:
make工具会拷贝系统的环境变量并设置为makefile的变量,在makefile中可直接读取或修改拷贝后的变量。
#export test=10
#make clean
#echo $test
main:main.c main.h
gcc main.c -o main
clean:
rm main -rf
echo $(PWD)
echo "test=$(test)"
03预定义变量
makefile中有许多预定义变量,这些变量具有其特殊的含义,可在makefile中直接使用
$@ 目标名
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表中除去重复文件的部分
AR 归档维护程序的程序名,默认值为ar
ARFLAGS 归档维护程序的选项
CC C编译器的名称,默认值为cc
CFLAGS C编译器的选项
CPP C预编译器的名称,默认值为$(CC) -E
CPPFLAGS C预编译器的选项
CXX C++编译器的名称,默认值为g++
CXXFLAGS C++编译器的选项
采用预定义变量后的makefile文件
编译结果
04 最精简版的makefile
编译结果: