目录
一、前言
二、Vim的使用
2.1 普通模式
2.2 插入模式
2.3 命令行模式
2.4 可视模式
三、GCC编译器
3.1 预处理阶段
3.2 编译阶段
3.3 汇编阶段
3.4 链接阶段
3.5 静态库和动态库
四、Gdb调试器
五、总结
一、前言
在Linux环境下使用C语言进行编程是一项基础且重要的技能。本文将详细介绍在Linux下使用C语言编程的完整流程,包括代码编辑(使用vim)、编译(使用gcc)、调试(使用gdb)。对于大型项目,手动编译每个文件会非常繁琐,因此我们还需要使用Makefile进行项目管理。本文将重点讲解vim、gcc和gdb的使用,后续会专门更新一篇关于Makefile的文章。
二、Vim的使用
Vim是一款功能强大的模态编辑器,广泛应用于Linux、Unix、MacOS和Windows等操作系统。它具有四种模式:普通模式、插入模式、命令行模式和可视模式。用户可以通过配置文件(.vimrc)对Vim进行个性化定制。
2.1 普通模式
普通模式是Vim的默认模式,键盘按键被解释为命令。以下是一些常用快捷键:
功能键 | 说明 |
i | 切换到插入模式,光标在所在位置的前面 |
I(大i) | 切换到出入模式,光标跑到行首 |
o(小o) | 切换到插入模式,在原来这行的下面新建一行 |
O(大o) | 切换到插入模式,在原来这行的上面新建一行 |
a | 切换到插入模式,光标在所在位置的后面 |
A | 切换到出入模式,光标跑到行尾 |
G | 移动到文件结尾 |
gg | 移动到文件开头 |
dd | 删除本行 |
yy | 复制本行 |
u | 撤销上一次操作 |
p | 粘贴 |
2.2 插入模式
功能键 | 说明 |
ESC | 返回到普通模式 |
2.3 命令行模式
通过在普通模式下按下 : 键(英文的冒号)进入命令行模式。
功能键 | 说明 |
w | 保存 |
q | 退出 |
q! | 强制退出 |
wq | 保存并退出 |
w filename | 另存一个名为filename的文件 |
set nu | 显示行号 |
2.4 可视模式
可视模式用于选择文本。用户可以通过在普通模式下按v键进入普通可视模式,按V键进入行可视模式,按Ctrl + v键进入块可视模式。
不过我平时不怎么用这个模式,所以这部分你们可以看看其他博主的文章。
三、GCC编译器
GCC(GNU Compiler Collection)是Linux下常用的C语言编译器。编译过程分为四个阶段:预处理、编译、汇编和链接。
3.1 预处理阶段
预处理阶段处理源代码中的预处理指令(如#include、#define等)。可以使用-E选项查看预处理结果:
gcc –E hello.c –o hello.i
3.2 编译阶段
编译阶段检查代码的语法和规范,并将代码翻译成汇编语言。可以使用-S选项查看汇编代码:
gcc –S hello.i –o hello.s
3.3 汇编阶段
汇编阶段是把编译阶段生成的“.s”文件转成目标文件,可使用选项“-c”就可。
gcc –c hello.s –o hello.o
3.4 链接阶段
链接阶段将目标文件与库文件链接,生成可执行文件。可以使用以下命令完成链接:
gcc hello.o -o hello
查看该二进制文件依赖的库:
ldd hello
- linux-vdso.so.1:虚拟动态共享对象(Virtual Dynamic Shared Object),它是 Linux 内核提供的一种机制,用于优化某些系统调用的性能。
- libc.so.6:GNU C 标准库(GNU C Library)的动态链接库文件。
- /lib64/ld-linux-x86-64.so.2:动态链接器(Dynamic Linker),也称为加载器(Loader)。它的作用是负责加载可执行文件及其依赖的共享库,并在程序运行时解析符号。
gcc编译器选项表
后缀名 | 功能 |
-c | 只编译不链接,生成目标文件“.o” |
-S | 只编译不汇编,生成汇编代码 |
-E | 只预编译,不做其他处理 |
-g | 在可执行程序中包含标准调试信息 |
-o file | 把输出文件输出到file里 |
-v | 打印出编译器内部编译过程的命令行信息和编译器的版本 |
-I dir | 在头文件的搜索路径列表中添加dir目录 |
-L dir | 在库文件的搜索路径列表中添加dir目录 |
-static | 链接静态库 |
-llibrary | 链接名为library的库文件 |
-I dir
“-I dir”选项可以在头文件的搜索路径列表中添加 dir目录。由于Linux中头文件都默认放到“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-Idir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。
-L dir
选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加 dir目录。
例如有程序 hello.c 需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libyourname.so,则只需键入如下命令即可:
gcc hello.c –L= /root/workplace/Gcc/lib –lyourname –o hello
需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。
另外值得详细解释一下的是“-l”选项,它指示 Gcc 去连接库文件 libyourname.so。由于在 Linux下的库文件命名时有一个规定:必须以 “lib” 3 个字母开头。因此在用-l 选项指定链接的库文件名时可以省去 l、i、b 3 个字母。也就是说 Gcc 在对“-lyourname”进行处理时,会自动去链接名为 libyourname.so 的文件。
警告和错误选项
选项 | 含义 |
-ansi | 支持符合ANSI标准的c程序 |
-pedantic | 允许发出ANSI C标准所列的全部警告信息 |
-pedantic-error | 允许发出ANSI C标准所列的全部错误信息 |
-w | 关闭所有警告 |
-Wall | 允许发出Gcc提供的所有有用的报警信息 |
-werror | 把所有的警告信息转化为错误信息,并在警告发生时终止编译过程 |
-On | 对代码进行优化,n=0~2 数字越大,优化等级越高 |
3.5 静态库和动态库
- 静态库:编译链接时将库文件的代码全部加入到可执行文件中,文件后缀为.a。使用静态库的程序在运行时不再需要库文件。
- 动态库:编译链接时不将库文件的代码加入到可执行文件中,而是在程序运行时由运行时链接器加载库文件,文件后缀为.so。使用动态库可以节省系统开销。
四、Gdb调试器
Gdb 调试器是一款 GNU开发组织并发布的UNIX/Linux下的程序调试工具。
使用c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。
步骤1 增加调试信息
gcc -g test.c -o test
步骤2 进入调试模式
gdb test
命令 | 功能 |
l(list) | 查看文件 |
b(break) n | 在第n行设置断点 |
delete n | 删除断点n |
info b | 查看断点情况 |
disable/enable n | 不使能/使能断点n |
r(run) | 运行代码 |
p(print) n | 查看变量n的值 |
n(next) | 单步运行(不会进入函数) |
s(step) | 单步运行(会进入函数) |
c(continue) | 恢复正常执行(遇断点停) |
finish | 恢复正常执行(遇断点不停) |
help | 帮助信息 |
q(quit) | 退出调试 |
五、总结
本文详细介绍了在Linux环境下使用C语言编程的完整流程,包括使用Vim进行代码编辑、使用GCC进行编译和链接、使用GDB进行调试。通过这些工具,开发者可以高效地进行C语言编程和调试。希望本文对您有所帮助,后续会继续更新关于Makefile和其他高级主题的文章。