Linux环境搭建(vim,makefile,gdb...)

来源:互联网 发布:剑三pvp鼠标宏编程 编辑:程序博客网 时间:2024/06/06 04:34

1、vim(编辑器)的使用
vim是vi的升级版本,二者都是多模式编辑器,vim兼容了vi的所有指令,同时还增加了一些新的特性在里面。
vi的三种基本模式:(vi有很多种模式,目前仅需掌握这三种)
1》命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入其他两种模式的中间模式。
2》插入模式:进行文字的输入,按【ESC】回到命令模式。
3》底行模式:将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。
(底行模式本质上也属于命令模式)

命令模式->插入模式:[i]、[a]、[o]
i:从光标当前位置进行输入
a:从光标的下一个位置进行输入
o:插入新的一行,从行首进行输入
命令模式->底行模式:[:]
: w (保存当前文件)
: wq (输入「wq」,存盘并退出vim)
: q! (输入q!, 不存盘强制退出vim)
进入命令模式:[ESC]

vi下命令模式下移动光标
「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
按「ctrl」+「b」:屏幕往“前”移动一页。
按「ctrl」+「f」:屏幕往“后”移动一页。
按「ctrl」+「u」:屏幕往“前”移动半页。
按「ctrl」+「d」:屏幕往“后”移动半页。

按「G」:移动到文章的最后。
按「$」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头

按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l。
按[gg]:进入到文本开始
按[shift+g]:进入文本末端

.删除文字
「x」:每按一次,删除光标所在位置的一个字符。
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符。
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。
「dd」:删除光标所在行。
「#dd」:从光标所在行开始删除#行

.复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

撤销上一次的操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

跳到指定行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

2、gcc,g++(编译器)的使用
编译过程:
a. 预处理(进行宏替换)—-> .i
b. 编译(生成汇编)—-> .s
c. 汇编(生成机器可识别代码)—-> .o
d. 链接(生成可执行文件或库文件)

“-E” 预处理
“-S” 编译(生成汇编)
“-c” 汇编(生成机器可执行代码)
“-o” 链接(生成可执行文件或库文件)
预处理功能主要包括宏定义,文件包含,条件编译三部分。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
文件包含:
<>:这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件.
” “:这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件.

编译:
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实 际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

汇编:将汇编代码转换成二进制代码

链接:生成可执行文件或库文件
函数库:静态库、动态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库⼀一般后缀名为“.so”。
gcc在编译时默认使用动态库。

gcc -o hello hello.c可分解为以下几步完成:
预处理:gcc -E hello.c -o hello.i
编译:gcc -S hello.i -o hello.s
汇编:gcc -c hello.s -o hello.o
连接:gcc hello.o -o hello
选项“-o”是指目标文件

gcc 总体选项列表:
-S 只是编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-c 只是编译不链接,生成目标文件“.o” (常用)
-o 文件 输出到 文件
-w 不生成任何警告信息。
-g 生成调试信息。GNU 调试器可利用该信息。

gcc与g++的区别:
误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。

误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

误区四:extern “C”与gcc/g++有关系
实际上并无关系,无论是gcc还是g++,用extern “c”时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。

3、gdb(Linux下的调试器)的使用
1介绍: gdb是Linux环境下的代码调试工具。
2使用:需要在源代码生成的时候加上 -g 选项.
3开始使用: gdb binFile
4退出:ctrl + d 或 quit
5调试过程:
l ist/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
s或step:进入函数调用
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
set var:修改变量的值
quit:退出gdb
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
6直接回
n 或 next:单条执行。
p 变量:打印变量值。

4、ctags(Linux下的代码查看)工程常使用
ctags -R : 在当前目录下建立索引。
ctrl + ]:跳转到函数或变量的定义处。
ctrl + T : 跳转至上级

5、Makefile—-自动化编译
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译
和链接程序。
编写Makefile的规则:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链 接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C 文件,并链接目 标程序。

在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统 命令,一定要以一个Tab键作为开头。
make并不管命令是怎么工作的,他只管执行所定义的命令。
clean不是一个文件,它只不过是一个动作名字,有点像C 语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖 性,也就不会自动执行其后所定义的命令。

make是如何工作的?
1 make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2 如果找到,它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文 件。
3 如果目标文件不存在,或是目标文件所依赖的后面的 .o 文件的文件修改 时间要比当前这个文件新,那么,他就会执行后面所定义的命令来生 成当前这个目标文件。
4 如果目标所依赖的.o文件也存在,那么make会在当前文件中找目标 为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这 有点像一个堆栈的过程)
5 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件, 然后再用 .o 文件声make的终极任务,也就是执行目标文件了。
以上就是整个make的依赖性,make会一层又一层地去找文件的依赖关系, 直到最终编译出第一个目标文件。如果没找到依赖文件,make就会报错退出。
通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接 或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可 以显⽰示要make执行。即命令——“make clean”,以此来清除所有的目标 文件,以便重编译。

清空目标文件的规则:
每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于 重编译,也很利于保持文件的清洁。
一般的风格都是:
clean:
rm file (objects).PHONY:cleanclean:rmfile(objects)
.PHONY意思表示clean是一个“伪目标”,而在rm命令前面加了一个小减 号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。clean从来都是放在文件的最后。

伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。
实例:如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目 标文件都写在一个Makefile中,那么你可以使用“伪⽬目标”这个特性:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
一般的,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目 标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那 三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也 就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪 目标”。

命令执行:
目标中的”%”定义表示对文件名的匹配,”%”表示长度任意的非空字符 串。

foreach函数:做循环时用
它的语法是: $(foreach ,, )
这个函数的意思是,把参数中的单词 逐一取出放到参数所指定的变量中,然后再执行所包含的表 达式。最后当整个循环结束时,所返回的每个 字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数的变量将不在作用,其作用域只在foreach函数当中。

shell函数:
它的参数应该就是操作系统Shell 的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系 统命令后的输出作为函数返回。
Makefile 有三个非常有用的变量:@^,<@:目标文件
<:第一个依赖文件