🌈个人主页:Yui_
🌈Linux专栏:Linux
🌈C语言笔记专栏:C语言笔记
🌈数据结构专栏:数据结构
🌈C++专栏:C++
文章目录
- 1.简单的vim配置
-
- [1.1 配置文件的位置](#1.1 配置文件的位置)
- [1.2 常用配置选项](#1.2 常用配置选项)
- [1.3 懒人一键到位的配置](#1.3 懒人一键到位的配置)
- [2. Linux编辑器gcc/g++使用](#2. Linux编辑器gcc/g++使用)
-
- [2.1 背景知识](#2.1 背景知识)
- [2.2 关于编译器的一些知识](#2.2 关于编译器的一些知识)
- [2.3 gcc如何完成工作](#2.3 gcc如何完成工作)
- [2.4 函数库](#2.4 函数库)
1.简单的vim配置
1.1 配置文件的位置
在目录/etc/下面,有个vimrc
的文件,这是系统中公共的vim配置文件,对所有用户都有效。
而在每个用户的主目录下,都可以自己建立私有的额配置文件,命名为:.vimrc
。例如,在/root
目录下,通常已经存在一个.vimrc
文件,如果不存在,自己创建一个就可以了。
注意 :配置vim不要再系统公共的vimrc
进行配置,这样就会给每个用户都配置了,Linux毕竟是一个多用户的操作系统,每个人的配置喜好都是不同的,所以呢,用户如果需要配置vim就在用户的当前目录进行配置。按 cd~
进入当前用户的主工作目录。
打开当前目录下的.vimrc
,执行vim .vimrc
.
1.2 常用配置选项
- 设置语法高亮:syntax on
- 显示行号:set nu
- 设置缩进的空格数位4:set shiftwidth=4
这是没有配置过的vim:
配置后:
尽管前后大差距不大,但如果你配置了几十上百条呢?vim就会显得很不同啦。
1.3 懒人一键到位的配置
2. Linux编辑器gcc/g++使用
2.1 背景知识
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 链接(生成可执行文件或库文件)
2.2 关于编译器的一些知识
大家有没有想过明明软件的运行需要编译,而编译器也是软件那么编译器也需要编译,所以是先有的语言还是先有的编译器?
先给出答案吧,当然是先有的语言。
我们都知道最开始控制计算机是需要使用二进制的,利用打孔纸袋来控制计算机。就是这样的纸袋。
然后因为二进制来控制计算机实在是太麻烦了,科学家就发明出来了汇编语言,汇编语言虽然是低级语言,但也需要编译器让它转化位二进制。那么汇编语言的编译器是用什么写的呢?没错是用二进制写的,在最开始会利用二进制写的编译器编译汇编语言,在编译成功后,我们就可以用汇编语言写一个编译器,然后在二进制编译器编译成功后就改用汇编写到编译器来编译汇编语言。
以此类推像C/C++编译器也是如此。
编译器的自举 :
C->低级语言写一个C编译器 ->能形成软件了
C编译器->C ->低级语言写一个C编译器 ->形成了用C写的编译器了
C:>用C写的编译器了->编译C语言
C编译器优化v2->用C写的编译器v1->v2编译器
2.3 gcc如何完成工作
语法:
shell
gcc [选项]要编译的文件[选项][目标文件]
预处理:进行宏替换
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
- 预处理指令以#号开头的代码行
- 实例:从出现开始进行程序的翻译过程,当预处理做完后就停下来
shell
gcc -E test.c -o test.i
- 选项
-E
,该选项的作用是让gcc在预处理结束后停止编译过程 - 选项
-o
是指目标文件,.i
文件为已经预处理过的C原始程序。
编译:生成汇编 - 在这个阶段中,gcc首先检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。
- 用户可以使用
-S
选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码,
实例:从现在开始进行程序的翻译,当编译工作做完就停下来
shell
gcc -S test.i -o test.s
汇编:生成机器可识别代码
- 汇编阶段是把编译阶段生成的
.s
文件转化为目标文件 - 读者在此可使用
-c
就可以看到汇编代码转化为.o
的二进制目标代码了
实例:从现在开始进行程序的翻译,当汇编工作做完就停下来
shell
gcc -c test.s -o test.o
因为vim是文本编辑器,查看二进制文件就会出现一堆乱码。
链接:生成可执行文件或库文件
- 在汇编成功后,就进入了链接阶段
实例:
shell
gcc test.o -o mybin
2.4 函数库
我们的C程序中,并没有定义printf
的函数实现,且预编译中包含的stdio.h
中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现printf
函数的呢?
回答 :
系统把这些函数实现都被做到名为libc.so.6
的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径/usr.lib
下进行查找,也就是链接到libc.so.6
库函数中去了,这样就能实现函数printf
了,而这也就是链接的作用。
函数库一般分为静态库个动态库两种
- 静态库是指链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但是在运行时也就不需要库文件了。其后缀一般为
.a
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统开销,动态库一般后缀名
.so
如前面所说的,libc.so.6
就是的动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下:
shell
gcc test.o -o test
- gcc默认生成的二进制程序,是动态链接的,这点可以通过
file
指令验证
gcc选项
- -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
- -S 编译到汇编语言不进行汇编和链接
- -c 编译到目标代码
- -o 文件输出到 文件
- -static 此选项对生成的文件采用静态链接
- -g 生成调试信息。GNU 调试器可利用该信息。
- -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
- -O0
- -O1
- -O2
- -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
- -w 不生成任何警告信息。
- -Wall 生成所有警告信息