vi 编辑器,gcc 编译器的使用

jopen 9年前

 vi编辑器是我们在linux下经常使用的文本编辑器,这个东西也是专门为程序员准备的,基本上每个Unix和Linux系统都为我们提供了这个软件,我们可以使用vi来编写我们的代码。在vi编辑器下所有操作都必须通过键盘和特定的快捷键组合来完成,刚开始学习的新手会感觉不太容易,但是这个东西很重要,我们先来学习如何使用它,掌握了这个东西去面试的时候也算是一门技能。而vim是vi的增强版,新增加了很多功能。

在shell下输入命令vi 文件名,例如:vi first.c,就开始编辑first.c文件了。vi编辑器有三种模式,它们分别为命令模式,底行命令模式和编辑模式,各个模式的转换如下。

vi 编辑器,gcc 编译器的使用

命令模式(按i进入编辑模式。按":"进入底行命令模式)。当我们vi first.c的时候一进入就是命令模式,在这个模式下,我们可以执行如下的操作。
x:删除一个字符
dd:删除光标所在行
ndd:删除n行
p:粘贴光标下行,就是把复制的内容粘贴到光标所在行的下一行。
yy:复制光标所在行
nyy:复制n行
u:恢复上一次操作

编辑模式(按Esc回到命令模式,然后再按下:就到了底行命令模式)。在命令模式的时候我们按下i键就进入了这个模式,这个时候就可以编辑文字了。我们输入的每个字符都会写上去,不像命令模式那样字符代表的是一种命令。

底行命令模式 :支持如下的一些常用命令,你输入这些字符的时候观察vi编辑器的下边,每个字符都会出现在底边的一行,就像一个只有一行的命令窗口。
w:保存文件
q:退出vi编辑器
!:强制
wq:保存退出,这个是我们经常用的,当我们写完代码的时候就用这个命令,保存退出到shell下。
q!:强制退出 这个也是我们常用的,当我们看完了自己的代码,不希望修改的代码生效,就是这个命令。
%s/str1/str2/g :把当前文件的str1全部替换为str2
/str:查找字符串str
set nu:显示行号 在vi编辑器的左侧可以显示出行号,没有行号的话就用这个命令显示。
set nonu:不显示行号

好了vi编辑器就说到这,大家多用几次就熟了。下面来说gcc编译器。 我们在windows下写程序的时候,用的都是图形化的集成工具,像什么vc++6.0啦vs各个系列的版本啦,这些工具都集成了代码的编辑,编译,链接 等操作。但是在linux下就不行了,我们写好了代码需要我们自己手动的编译,链接,生成可执行文件。所以说在linux下学习c语言你才真正的了解它, 可以学的更加深入!下面我们就来说这个工具gcc编译器。

gcc 编译器
gcc xx.c 使用这个命令就会生成最终的可执行文件a.out(在shell下使用./a.out就可以执行你的程序了),他把下面的几步都隐藏了。
1,预处理:针对指令
2,编译:语法的检测
3,汇编:从高级语言->汇编语言->机器语言
4,连接:把用到的各种资源打包到一起

在使用gcc xx.c这个命令的时候我们带一些选项字段可以做一些更改,常用的字段如下所示:

-o 改变目标的文件名 例如gcc first.c -o first这样的话,最后的可执行文件名就不是a.out了,而是first
-E 预处理
-S 汇编 以上这俩个选项我也不知道怎么用,反正还没用过。
-l 链接库名 这个是要用到的,链接库的名称一般是libxxx.so,我们使用的时候就用 -lxxx就行了
-L 指定库的路径 这个也是经常用的
-I 指定头文件的路径
-c 只编译不链接 这个时候不会生产可执行文件,而是编译以后的.o文件
-Wall 显示更多的警告
-O1、O2、O3:优化级别

动态库的创建和使用

首先我们说一下什么是库,库说白了就是别人写好的程序。我们写程序不可能从头开始,肯定会调用到这些写好的库来为我们完成一些功能。库分为静态库和动态库,它们都是在链接的时候才使用的。windows 下的静态库是以.lib结尾的,动态库是以.dll结尾的,linux下分别是以.a和.so结尾的。静态库在链接的时候就会嵌入到程序中,而动态库是程 序在运行的时候才会调用的,他们的优缺点大家可以自行百度、google。那么我们就来说一下linux下如何创建和使用动态库吧。动态库又叫共享库,它是代码的合集,在使用的时候提供代码库中的地址。

1创建共享库
写源代码
编译源代码,生成目标文件add.o。使用命令gcc -c add.c
生成共享库。使用命令gcc -shared add.o -o libadd.so

2使用动态库
写源代码main.c
编译gcc -c main.c 
连接gcc main.o -ladd -L.
如果直接运行可执行文件会出错(因为链接的时候只是在可执行文件中写进去了动态库中函数的地址,但是动态库的文件在什么地方还不知道),需要在运行时配置环境变量LD_LIBRARY_PATH
使用命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 那个.是我的路径,你可以换成你自己的路径。