通过在文字下方添加“=”和“-”,他们分别表示一级标题和二级标题。
(当>和文字之间添加五个blank时,块注释的文字会有变化)
将需要设置为斜体的文字两端使用1个 “*” 或者 “_” 夹起来
将需要设置为斜体的文字两端使用2个 “*” 或者 “_” 夹起来
注意在(*, +, and -)和文字之间需要添加空格。(建议:一个文档中只用一种无序列表的表示方式)
使用数字后面跟上句号。(还要有空格)
引用方式
内联方式:
引用方式:[alt text][id]
[id]: /path/to/img.jpg "Title"
<blockquote>
。(不是单引号而是左上角的ESC下面~中的
)大片文字需要实现代码框:使用Tab和四个空格。
在空白行下方添加三条“-”横线。
在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按a(append/追加)键或者i(insert/插入)键。
在插入模式中,可以按ESC键回到普通模式。
这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim的"文本对象"也能和移动命令一样用在这个模式中。
这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的话,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。
i 在当前光标处进行编辑
I 在行首插入
A 在行末插入
a 在光标后插入编辑
o 在当前行后插入一个新行
O 在当前行前插入一个新行
cw 替换从光标所在位置后到一个单词结尾的字符
:q! 强制退出,不保存
:q 退出
:wq! 强制保存并退出
:w <文件路径> 另存为
:saveas 文件路径 另存为
:x 保存并退出
:wq 保存并退出
x 删除游标所在的字符
X 删除游标所在前一个字符
Delete 同x
dd 删除整行
dw 删除一个单词(不适用中文)
d$或D 删除至行尾
d^ 删除至行首
dG 删除到文档结尾处
d1G 删至文档首部
nG(n Shift+g) 游标移动到第 n 行
(如果默认没有显示行号,请先进入命令模式,输入:set nu以显示行号)
gg 游标移动到到第一行
G(Shift+g) 到最后一行
w 到下一个单词的开头
e 到下一个单词的结尾
b 到前一个单词的开头
ge 到前一个单词的结尾
0或^ 到行头
$ 到行尾
f<字母> 向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
F<字母> 向前搜索<字母>并跳转到第一个匹配的位置
t<字母> 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
T<字母> 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
普通模式中使用y复制
yy 复制游标所在的整行(3yy表示复制3行)
y^ 复制至行首,或y0。不含光标所在处字符。
y$ 复制至行尾。含光所在处字符。
yw 复制一个单词。
y2w 复制两个单词。
yG 复制至文本末。
y1G 复制至文本开头。
普通模式中使用p粘贴
p(小写) 代表粘贴至光标后(下)
P(大写) 代表粘贴至光标前(上)
r+<待替换字母> 将游标所在字母替换为指定字母
R 连续替换,直到按下Esc
cc 替换整行,即删除游标所在行,并进入插入模式
cw 替换一个单词,即删除一个单词,并进入插入模式
C(大写) 替换游标以后至行末
~ 反转游标所在字母大小写
u{n} 撤销一次或n次操作
U(大写) 撤销当前行的所有修改
Ctrl+r redo,即撤销undo的操作
>> 整行将向右缩进
<< 整行向左回退
:set shiftwidth? 获取目前的设定值
:set shiftwidth=10 设置缩进为10个字符
:ce 本行内容居中
:ri(right) 本行文本靠右
:le(left) 本行内容靠左
/icmp 查找字符串icmp
n 查找下一个icmp
?tcp 向上查找字符串tcp
N 查找上一个出现的tcp
\* 寻找游标所在处的单词
\# 同上,但\* 是向前(上)找,#则是向后(下)找
g\* 同\* ,但部分符合该单词即可
g\# 同\# ,但部分符合该单词即可
vim 1.txt 2.txt
:n 编辑2.txt文件,可以加!即:n!强制切换
:N 编辑1.txt文件,可以加!即:N!强制切换,
注:之前文件内的输入没有保存,仅仅是切换到另一个文件
进入vim后打开新文件
:e 3.txt 打开新文件3.txt
:e# 回到前一个文件
:ls 可以列出以前编辑过的文档
:b 2.txt(或编号) 可以直接进入文件2.txt编辑
:bd 2.txt(或编号) 可以删除以前编辑过的列表中的文件项目
:e! 4.txt 新打开文件4.txt,放弃正在编辑的文件
:f 显示正在编辑的文件名
:f new.txt 改变正在编辑的文件名字为new.txt
:sp 1.txt 打开新的横向视窗来编辑1.txt
:vsp 2.txt 打开新的纵向视窗来编辑1.txt
Ctrl-w s 将当前窗口分割成两个水平的窗口
Ctrl-w v 将当前窗口分割成两个垂直的窗口
Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗
Ctrl-w j 移至下面视窗
Ctrl-w k 移至上面视窗
Ctrl-w h 移至左边视窗
Ctrl-w l 移至右边视窗
Ctrl-w J 将当前视窗移至下面
Ctrl-w K 将当前视窗移至上面
Ctrl-w H 将当前视窗移至左边
Ctrl-w L 将当前视窗移至右边
Ctrl-w 减小视窗的高度
Ctrl-w + 增加视窗的高度
:set或者:se 显示所有修改过的配置
:set all 显示所有的设定值
:set option? 显示option的设定值
:set nooption 取消当期设定值
:set autoindent(ai) 设置自动缩进
:set autowrite(aw) 设置自动存档,默认未打开
:set background=dark或light 设置背景风格
:set backup(bk) 设置自动备份,默认未打开
: set cindent(cin) 设置C语言风格缩进
$ vim -x file1
在光标所在位置开始插入文本,请按∶i 输入必要文本
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
更改类命令的格式是∶
[number] c object 或者 c [number] object
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
:!command 用于执行一个外部命令 command。
例子∶
:!dir - 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件
:r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置后面。
输入 :set xxx 可以设置 xxx 选项。
提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。
保存文件,命令为∶:write
qa 把你的操作记录在寄存器 a。于是 @a 会replay被录制的宏。
@@ 是一个快捷键用来replay最新录制的宏。
+ (或 -) : 增加尺寸
.c C语言源文件
.C .cc .cxx C++源文件
.m Object-C源文件
.i 经过预处理后的C源文件
.ii 经过预处理后的C++源文件
.s .S 汇编语言源文件
.h 预处理文件(头文件)
.o 目标文件
.a 存档文件
原文件->预处理->编译->汇编->连接->可执行文件
注:请记住,gcc预处理源文件的时候(第一步),不会进行语法错误的检查。
语法检查会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误等。
通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。
通常文件名为“libxxx.a”的形式。
动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”
使用归档工具ar将目标文件集成在一起:
gcc –c file1.c file2.c
ar rcsv libxxx.a file1.o file2.o
编译主程序main.c,链接到生成的静态库libxxx.a 并运行
gcc -o main main.c -L. -lxxx
./main
使用-fPIC选项为动态库构造一个目标文件
gcc -fPIC -Wall -c file1.c
gcc -fPIC -c file2.c
使用-shared和和已创建的位置无关目标代码,生成一个动态库libxxx.so
gcc -shared -o libxxx.so file1.o file2.o
编译主程序main.c,链接到生成的动态库libxxx.a
gcc -o main main.c -L. -lxxx
注意:在运行可执行程序前需要注册动态库的路径名。例:将库文件直接复制到/lib目录下,然后运行
cp libxxx.so /lib
./main
-c 只编译,不连接成为可执行文件。即把.c文件编译成.o文件
-o 命名生成文件
ar -r 在库中插入模块(替换)
-c 创建一个库
-s 写入一个目录文件索引到库中,即把两个.o文件归档成静态库存档文件.a并且写入目录文件索引到库中。
-static 告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,进行静态编译,即链接静态库,禁止使用动态库
-shared 可以生成动态库文件,进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库
-Lpath 表示在path目录中搜索库文件,,如-L.则表示在当前目录。
-L dir 在库文件的搜索路径列表中添加dir目录
-lname 链接称为libname.a或者libname.so的库文件。如果两个库文件都存在,根据编译方式是static还是shared进行链接。
-fPIC 生成使用相对地址的位置无关的目标代码,然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。不用此选项的话编译后的代码是位置相关的。
-Ipaht 表示在path目录中搜索头文件。
-ltest 编译器查找动态连接库时有隐含命名规则,名字前加lib后加.so确定库的名称。
-Wall 允许发出gcc提供的所有有用的报警信息。
(4)动态地改变程序的执行环境。
gcc -g test.c -o test
gdb test
test是要调试的程序,进入后提示符变为(gdb) 。
(gdb) l
如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。
(gdb) b 6
这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
(gdb) info b
可以键入"info b"来查看断点处情况,可以设置多个断点;
(gdb) r
(gdb) p n
GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;
(gdb) watch n
在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;
(gdb) n
(gdb) c
使程序继续往下运行,直到再次遇到断点或程序结束;
(gdb) q
b 函数名 条件表达式
b 行数或函数名 条件表达式
b 行数或函数名 if表达式
tbreak 行数或函数名 条件表达式
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则(这个示例来源于GNU的make使用手册):我们的工程有若干个.C文件和.h文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
makefile带来的好处就是——“自动化编译”。只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。
target ... : prerequisites ...
command
...
...
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也是Makefile中最核心的内容。
在默认的方式下,也就是我们只输入make命令。那么,
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在找了依赖关系之后,冒号后面的文件还是不在,那么就停止工作。
执行步骤:
(1)读入所有的Makefile。
(2)读入被include的其它Makefile。
(3)初始化文件中的变量。
(4)推导隐晦规则,并分析所有规则。
(5)为所有的目标文件创建依赖关系链。
(6)根据依赖关系,决定哪些目标要重新生成。
(7)执行生成命令。
定义变量的两种方式:
(1)递归展开方式
VAR=var
(2)简单方式
VAR:=var
使用变量的格式为:
$(VAR)
环境变量
自动变量列表
$@ 规则的目标文件名。如果目标是一个档案成员,则变量‘$@’ 档案文件的文件名。对于有多个目标的格式规则(参阅格式规则简介),变量‘$@’是那个导致规则命令运行的目标文件名
$% 当目标是档案成员时,该变量是目标成员名,参阅使用make更新档案文件。例如,如果目标是‘foo.a(bar.o)',则‘$%'的值是‘bar.o',‘$@'的值是‘foo.a'。如果目标不是档案成员,则‘$%'是空值。
$< 第一个依赖的文件名。如果目标更新命令来源于隐含规则,该变量的值是隐含规则添加的第一个依赖。参阅使用隐含规则。
$? 所有比目标‘新’的依赖名,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。
$^ 所有依赖的名字,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。对同一个目标来说,一个文件只能作为一个依赖,不管该文件的文件名在依赖列表中出现多少次。所以,如果在依赖列表中,同一个文件名出现多次,变量‘$^’的值仍然仅包含该文件名一次。
$+ 该变量象‘$^',但是,超过一次列出的依赖将按照它们在makefile文件中出现的次序复制。这主要的用途是对于在按照特定顺序重复库文件名很有意义的地方使用连接命令。
$* 和隐含规则匹配的stem(径),参阅格式匹配。如果一个目标为‘dir/a.foo.b',目标格式规则为:‘a.%.b' ,则stem为‘dir/foo'。在构建相关文件名时stem 十分有用。在静态格式规则中,stem是匹配目标格式中字符‘%’的文件名中那一部分。在一个没有stem具体规则中;变量‘$*' 不能以该方法设置。如果目标名以一种推荐的后缀结尾,变量‘$*'设置为目标去掉该后缀后的部分。例如,如果目标名是‘foo.c',则变量‘$*' 设置为‘foo', 因为‘.c' 是一个后缀。在隐含规则和静态格式规则以外,应该尽量避免使用变量‘$*'。在具体规则中如果目标名不以推荐的后缀结尾,则变量‘$*’在该规则中设置为空值。
(1)mul.c文件中写的返回值类型是double,但是main.c里面错写成int型“%d”。
(2)老师在要求中粘贴的main.c没有包含“head.h”和“stdio.h”两个文件头,是需要自己加上的。
(1)显示libmath.so没有那个文件或目录。原因:命令写错了,没有加-o
(2)执行可执行文件,提示没有libmath.so的文件,需要注册动态库的路径名。我本来想用书上的方法——可以直接复制到/lib文件下,但是cp了之后它提示权限不够。我用su想获取权限,账号密码不都是shiyanlou吗?! 试了好几次都说认证失败。果断改用目录的形式:
也不知道当时我怎么想的居然创建了一个math1文件....
再进去用:w 改名!
原因:
(1)写静态库makefile的时候写错了,把“math1”写成了“math.1”:
(2)恰好创建的时候改名前文件是math1,所以显示的是权限不够,我开始还以为是之前创建的math1有问题,所以删除了math1,之后又显示成了没有文件或目录。改成这样就好了: