1. 编译的三大工具
gedit vim touch
gedit和vim是创建并且打开;touch只是创建
这里我主要介绍下vim的使用方法:(vim分为命令模式(就是创建打开时的模式);插入模式(编写程序时的模式);底行模式(一般通过底行模式来保存退出vim编辑器))
首先谈谈基本的用vim创建文本:
1. 通过 sudo apt-get install vim 命令操作来下载vim包并且会给你自动安装,然后在/etc/vim下的vimrc就是vim的配置文件,我们可以修改vimrc中的配置,让vim文本更加的炫酷,可以去百度,然后复制,然后用gedit vimrc打开(如果用vim打开也行但是操作比较麻烦),然后粘贴到vimrc中就可以了。
2. vim 1.c 创建一个文本,打开时是命令模式,按下Esc,就可以切换,在按下“i”就可以进入插入模式。
3.写好了程序后在按下“shift”+“:"就进入了底行模式,然后输入指令(比如q(退出);wq(保存并且退出),!(强制执行)x(若修改保存退出否则直接退出))
在来谈谈各个模式下的指令操作;
- 打开操作:vim+文件;vim “+行号”+ 文件(创建并打开到第几行)
2. 编辑器
命令模式:(我觉得我们经常用到的)
- 文本删除操作: (n)dd :删除光标所在行(n代表要删除的行数)
- 文本复制粘贴操作 (n)yy: 复制光标所在行(n代表当前及后n-1行) ;p: 粘贴当前缓冲区内容
- 撤销命令(相当于Ctrl +z):u
插入模式(我们常用的)
- 插入文本命令(i:将文本插入到光标所在位置 I:将文本插入到当前行首 a:将文本加到光标所在位置之后 A:将文本追加到所在行尾 o:在光标所在行下面添加空行 O:在光标所在行上面添加空行)
- 按esc进入命令行模式
底行模式(我们常用的)
- 底行操作:命令模式下按冒号进入
- 退出指令:(q!:强制退出 w :保存文件 w! :强制保存 wq:保存退出 x :若修改保存退出否则直接退出 )
- 搜索字符串: /字符串 ; ?字符串;
- 字符串替换: %s /源字符串/目标字符串/g
可视模式:
- 命令模式下v进入可视模式
- d:删除 y:复制 x:剪切
3. 编译器(gcc编译器)
- 功能就是将你写的代码翻译成机器更够识别的语言(二进制语言)
- 一个.c从写到执行经历了4个过程
常用编译选项
- 1、-o选项,指定输出文件名:gcc -o helloworld helloworld.c 结果会在与helloworld.c相同的目录下产生一个a.out的可执行文件。
- 2、没有任何选项:gcc helloworld.c 结果会在与helloworld.c相同的目录下产生一个a.out的可执行文件。
- 3、-C选项,只编译,不汇编连接:gcc -c helloworld.c -c意思就是Compile,产生一个叫helloworld.o的目标文件
- 对比:2和3这两个都是生成可以执行的文件,但是不加任何选项的生成的系统默认是a.out执行文件,但是用-C可以修改生成的执行文件的名称(比如:gcc -C 1.c -o 1 表示:生成的执行文件的名字是1 和a.out没啥区别)
- 4、-S选项,产生汇编源文件:gcc -S helloworld.c -S意思就是aSsemble,产生一个叫helloworld.s的汇编源文件
- 5、-E选项,预处理C源文件
- 6、 -g选项,产生供gdb调试用的可执行文件:gcc -g helloworld.c 产生一个叫作a.out的可执行文件,大小明显比只用-o选项编译汇编连接后的文件大。
程序编译过程(我用1.c举例)
- 编译预处理 gcc –E 1.c –o 1.i 结果生成1.i文件(处理伪指令(#)和特殊的特殊符号 比如#ifndef #define #endif)
- 编译 gcc -S 1.i -o 1.s 结果生成1.s的汇编文件
- 汇编 as 1.s -o 1.o 结果生成1.o的机器可以识别的语言
- 链接 gcc 1.o -o 1 结果生成1的可以执行的文件(./1相当于./a.out)
4.动态库和静态库
- 库的概念:包含了通用函数的数据和二进制可执行机器码的文件(通俗:就是一些函数的声明;你调用了别人函数,那么你就要去声明使用人家的库包含了通用函数的数据和二进制可执行机器码的文件保护源码)
- 分为动态库(.a)和静态库(.so)
库的制作:
静态库的创建:
- gcc -c fun.c 生成.o文件
- ar -rc libfun.a fun.o 打包生成静态库(生成libfun.a)
- 创建main.c 声明fun; 然后调用fun
- gcc main.c libfun.a 生成a.out执行文件(mian和fun函数结合的a.out)
动态库的创建:
- gcc -c fun.c 生成.o文件
- gcc -fpic -shared fun.o -o libfun.so 生成动态库
- 把库文件复制到/lib下和/usr/lib
- gcc main.c -lfun //利用动态库编译程序 -l:后面跟需要链接的库
- 运行程序 运行期间会寻找动态库,只会在系统默认路径下寻找,所以需要把库文件复制到/lib和/usr/lib下
- ./a.out 运行程序 运行期间会寻找动态库,只会在系统默认路径下寻找,所以需要把库文件复制到/lib和/usr/lib下
静态库和动态库的区别:静态库是直接将库文件编译到可执行的文件中,而动态库是/lib 和 /usr/lib寻找(有个动态的寻找过程)
5.调试工具gdb
- 为何需要gdb:因为在编写程序的时候都会出现错误,所以这个时候就需要调试
- 常用调试技巧:
- 测试:找出程序中存在的缺陷或错误
- 固化:让程序的错误可重现
- 定位:确定相关的代码行
- 修改代码纠正错误
- 确定修改解决了问题