一、vim编辑器
1、文本编辑(三种模式:命令行模式、插入模式、底行模式(底行冒号))
命令行模式可以与插入模式相互转化,只有命令行模式能进入底行模式
命令行模式(不能录入程序,只能整块复制、移动、删除;)
1、此模块直接录入命令
(n)yy 复制命令 (表示从光标位置复制到第n行);
p 粘贴命令(区分大小写:大写表示从光标所在行开始粘贴,小写表示从光标下一行开始粘贴 );
u 撤销命令 (可以连续撤销);
(n) dd 剪切/移动命令 (表示从光标位置剪切到第n行);
G 光标移动到尾部
V 光标选择所在的一行,v (可视行,可选择连续多行),ctrl + v (可视块,可选择整块内容s)
d1G 把光标所在位置到文件第一行全删除,y1G 把光标到文件第一行的内容全复制
dG 光标到文末 全删,yG 光标到文末 全复制;
(n) x 删除后n个字符 , (n) X 删除前n个字符
2、此模块录入命令前需要(:)
:/name(内容) 查找名为name的内容;n 将查找内容向上切换,N 将查找内容向下切换
:n1,n2 s/word1/word2/g (将第n1行到第n2行的字符word1替换为word2);
1 , $ -s/word1/word2/ (将全文的字符word1替换为word2)
底行模式(用冒号(:)开头,写入命令)
1、一般命令
:w 保存; :w 文件名(将当前文件的内容另存为设定的文件名中);
:n1,n2 w 文件名 (将当前文件的第n1行到第n2行的内容另存为设定的文件名中)
:q 退出; :q! 强制推出;
:r (文件名) (将其他文件中的内容读写到当前文件的光标下面)
:set nu 显示行号 ; :set nonu 不显示行号;
:!ls (在vim模式下,查看当前目录下的所有文件)
2、多文档编辑
vim 原文件.c 源文件.c.....(可以若干个同时打开),
:n 将打开的文件向后切换 :N 将打开的文档向前切换
:files 在窗口显示总共打开了几个文件
:q 全退出
3、多窗口编辑
vim 源文件.c
: sp 源程序.c (加入另一个程序窗口)
:ctrl ww 上下两个窗口互换
:ctrl wj 切换到下面窗口
:ctrl wk 切换到上面窗口
:q 全退出
二、gcc工具链
从C语言源码到可执行程序一般要经过以下的处理步骤:
1. 预处理
在这一阶段,源码中的所有预处理语句得到处理,例如
#include语句所包含的文件内容替换掉语句本身
所有已定义的宏被展开
根据#ifdef,#if等语句的条件是否成立取舍相应的部分
预处理之后源码中不再包含任何预处理语句。
GCC预处理阶段可以生成.i的文件,通过选项-E可以使编译器在预处理结束时就停止编译。例如: gcc -E -o hello.i hello.c
2. 编译
这一阶段,编译器对源码进行词法分析、语法分析、优化等操作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。
可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。
例如: gcc -S -o hello.s hello.c
3. 汇编
这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存在后缀为.o的目标文件中。
当程序由多个代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。
目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件: gcc -c -o hello.o hello.c
4. 链接
经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。
gcc -o hello hello.c
5、选项标识
-O ,-O2,-O3 优化代码;
-g (gdb 调试器) 代码会成倍增大。
-C 编译时,注释不删除;
-I 指出头文件位置 , -L 指出库的路径 ;-l 指出库名(-lname)
当在gcc程序时遇到: 数学运算(开根号)、数据库编程、线程编程、三种情况时,需要录入 -lm、-lsqlite3、-lpthread 三种库名。
创建库(重点):库中二进制目标文件,不能含有主函数
1、创建头文件(如:main.h):
vim main.h(在里面写入需要调用函数的声明):
2、创建静态库
使用方法:gcc -c 源程序(.c 文件)【将源程序转化为目标文件(.o 文件)】;
ar rcs 静态库名(lib+name.o) 目标文件1 目标文件2 ....【将目标文件创建为库】
使用库:gcc 主程序.c -o 可执行文件 -L(库的路径) -lname [-I(头文件路径)]
库和头文件在当前目录下:
库和头文件不在当前目录下(在text目录中):
3、创建动态库
使用方法:gcc -shared -fPIC -o 库名(ib(name).so) 源文件(.c 文件 可以若干个);
gcc 主程序.c 库路径(./动态库名(.so文件)) -o 可执行文件 [-I(头文件路径)]
库和头文件在当前目录下:
库和头文件不在当前目录下(在text目录中):
C语言中常见问题:
1、解决C语言中从键盘输入空格的三种方法:
scanf("%[^\n]",&x); gets()(只认回车键,但是有警告!);fgets();
2、警告:-Wall (非致命警告);-w (不生成警告信息)
3、宏定义
-DPI = 3.14 (在gcc编译命令中直接添加)
-UPI (取消宏定义)
三、gdb调试器
主要功能:控制程序运行(在gcc 中加入 -g )
启用gdb的常用步骤:(前三步必须做,缺一步就没有调试的意义)
1、启用被调试程序
gcc -g 源文件.c -o 可执行文件;
gdb 可执行文件名;
(加入gdb模式)
2、进入gdb模式后,设置断点(break(b))
b (n) 设置第n 行为断点
b 函数名 设置函数为断点
断点编号是指按设置断点的先后对断点的编号;
断点设置后,才能用 info break(b) 查看断点信息;
3、运行程序(run 运行程序)
只有整个程序运行起来之后,才能进行以下操作:
next(n):单步运行; continue(c):运行到下一个断点;
finish(f):完成函数运行(用于函数断点),到调用位置。
p 变量名 (显示变量名的值)
退出调试 用q
gdb模式下的命令:
1、list(l)命令 :
l:(查看代码,默认10行); l (函数名):从指定函数显示;
l(行号):从指定行号显示
2、break(b)命令:
break(b) 函数名: 在某函数入口处添加断点;
break(b) 行号:在指定行添加断点
break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,
例b 5 if i=10,当i等于10时第5行断点生效
info break 显示断点信息
4、run(r) 开始运行程序
5、next(n) 单步运行程序(不进入函数)
6、step(s) 单步运行程序(进入函数)
7、continue(c) 继续运行程序
8、print(p) 变量名 查看指定变量值
9、finish 直到当前函数结束
10、watch 变量名 对指定变量进行监控
11、quit(q) 退出gdb
12、delete(d)断点编号 (删除断点)
13、start 跳转到主函数第一句
15、set 变量名 = 值 :改变变量值
16、clear清除断点命令
clear 行号 (清除行号断点)
clear 函数名 (清除函数断点)
17、enable 激活
18、disable 失效
C语言函数调用相关问题:
1、函数调用到哪,函数就返回到哪;
2、函数返回
返回值(return 0;return只能返回一次)
流程返回(void 函数,}表示返回功能)
3、函数返回的值由函数的类型决定
流程转向问题:(限定性与非限定性)
限定性:continue 、 break 、函数调用、 函数返回
非限定性:由我们自己指定(如:goto 语句:多用于多重循环嵌套)
四、make工具
1、make的定义
Make工程管理器(多文件编译)
特点:自动编译管理器,只对修改过的文件做编译;读入makefile文件的内容来执行大量的编译工作。
目的:用makefile文件的规则对编写的所有文件进行编译。
2、makelifed的内容(makefile是make读入的惟一配置文件)
makefile中通常包含如下内容:
a.需要由make工具创建的目标体(如:main(开头顶行写)),
通常是目标文件(.o文件)或可执行文件(main编译后文件);
b.要创建的目标体所依赖的文件;
创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头
具体情况如:
main(最终目标):add.o sub.c nul.c div.c main.h main.c (依赖)【依赖转化为目标体】
( tab)gcc sub.c nul.c div.c main.c -o main(命令)
{以上为一个规则}
add.o(目标体):add.c(依赖)【将依赖通过命令转化为目标体的操作】
(tab)gcc -c add.c (命令)
(重点):下层的目标体为上层的依赖;一个makefile有多个规则,多个规则就有多个目标体,但是只有一个最终目标体;目标的需求(依赖),为下一个规则的目标。
3、makefile的创建与使用
创建makefile的要点:
1、makefile与Makelife同时存在时,makefile优先
2、makefile是make读入的默认统一的配置文件
3、makefile是规则(makefile是默认文件名,可以自定义)
4、makefile命名
自定义:编译时:make -f 文件名
默认(makefile):编译时:直接make
5、“#”字符后的内容被视作注释;@:取消回显;
makefile的伪目标:
1、若创建的目标没有依赖,则属于伪目标(伪目标的执行方式为:make + 伪目标名)
.PHONY : clean (“.PHONY” 将“clean”目标声明为伪目标)
clean :
rm –f hello main.o func1.o func2.o
2、伪目标声明的意义在于,如果有可执行文件与伪目标同名;make clean 就不会执行伪目标,而去执行可执行文件。
使用变量:(用$符合引用)
obj=main.o func1.o func2.o func3.o
hello: $(obj)
gcc $(obj) -o hello
在makefile中,存在系统默认的自动化变量
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
例:(以下两个规则是相同的)
hello: main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
hello: main.o func1.o func2.o
gcc $^ -o $@
makefile的使用:
1、自己创建makefile
makefile 命名为 life;最终创建以下的文件目录:
life的编写
创建好life后, 执行 make -f life
2、运用makefile的模板(client)
client模板中的环境配置:
环境中总共有三处 makefile: main(主函数文件下的makefile; 根目录下的makefile; scripts 目录下的makefile;)
使用方法:(一个添加,两个删除,三个修改)
1、删除client(原本属于主函数(主功能))
2、删除原有的不符合自己要求的功能函数(check_putin, pack_message)
3、添加自己的函数功能(如:add、div、sub等)
4、修改include 头文件内容(一般指 函数声明)
5、修改主函数(main)的功能
6、修改scripts中的makefile(规则:一般指函数功能的编译命令)
修改过后的环境: 关于scripts/makefile 的修改:
关于include 头文件的修改:(函数声明)
五、shell工具
1、shell的含义
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它互动式地解释和执行用户输入的命令;
2、shell程序基础
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
#!用来告诉系统它后面的参数是用来执行该文件的程序。
要使脚本可执行:
chmod +x filename
然后,您可以通过输入: ./filename 来执行您的脚本
3、变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
变量名=值
取出变量值可以加一个美元符号($)在变量前面
4、shell程序运行
#!/bin/sh
#(为注释符)对变量赋值:
a="hello world"
现在打印变量a的内容:
echo "A is:"
echo $a
在编辑器中输入以上内容,然后将其保存为一个文件HelloWorld。
之后执行chmod +x HelloWorld
最后输入./ HelloWorld执行该脚本。
这个脚本将会输出:
A is:
hello world