Lunix编程开发基础
前言
本文讲解如何在Lunix系统上进行编程开发,以C代码为例讲解如何对源代码进行编译,链接等,如何使用make工具和编写Makefile文件,以及如何对代码进行GDB调试,包括了在Lunix系统进行代码编程的一整套入门流程。现在虽然有比较好的Lunix集成开发工具,但是如果能够了解Lunix系统下代码的具体汇编,编译,链接,调试等各个阶段及其命令,一定是一个合格的Lunix开发人员的基础。
一、GCC编译器
- 由编写的C语言源码到可执行的程序要经过下图所示的几个阶段。
1.C代码源码*.c文件;=》2. 生成汇编代码;=》3.生成目标代码;=》4. 链接成可执行文件。
- GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。
GCC常用对应C代码编译过程的各个阶段的命令如下,命令中的“*”代表文件名,具体以hello.c源代码为例进行展示。
# hello.c源代码
#include<stdio.h>
int main(void)
{
printf("hello\n");
return 0;
}
1.预编译过程,生成预处理后的文件*cpp。处理宏定义和include,去除注释,不会对语法进行检查。
gcc -E -o *.cpp *.c
2.编译过程,生成编译文件*.s。这个阶段,检查语法,生成汇编代码。
gcc -S -o *.s *.c # 由源代码*.c直接生成汇编文件*.s
或者,
gcc -x cpp-output -S -o *.s *.cpp #由预处理代码*.cpp 生成 汇编代码 *.s
3.汇编过程,生成目标代码*.o。该阶段生成二进制机器代码,理论上可以执行,但是还没有与相关环境进行链接,因此还不能执行。
gcc -c *.c # 由源代码*.c直接生成目标代码*.o
或者,
gcc -x assembler -c *s -o *.o #由汇编代码 *.s 生成 目标代码 *.o
4.链接过程,生成可执行代码。
gcc -o * *.c # 由源代码*.c直接生成可执行程序 *
或者,
gcc -o * *.o # #目标代码 *.o 生成 可执行程序
总结:以上四个过程只是将生成可执行程序的过程分解了,一般常用的是直接有源代码*.c生成可执行程序,即一句话完成: gcc -o hello hello.c
5.执行程序
二、make命令工具
三、Makefile组成结构
Makefile由多个目标组成,每个目标包含多个前置条件(其它目标),以及自己的命令。
make工具默认执行Makefile文件中的第一个目标。
Makefile就是将大量的代码编译命令(gcc命令和Shell命令)封装在一个文件中,通过make工具直接执行Makefile中的命令,方便代码的编译。
注意,默认情况下,每个命令之前必须有一个tab键,不能用8个空格代替。
- 为hello.c源代码编写Makefile文件如下
- 执行make工具,生成可执行程序
- 执行make工具,删除文件
四、Makefile文件语法
- 将hello.c 的Makefile修改为以%通配符进行编写,具体实现如下
其中,$<表示第一个前置条件
= 赋值运算法,指VARIABLE被赋予value的最新值
:= 赋值运算符,指VARIABLE被赋予value的初始定义值
?= 赋值运算符,值VARIABLE为空时才被赋予value的最新值
+= 赋值运算符,值连接运算符
\ 表示 为同一条shell命令,因为每行命令在同一个shell中执行,没有继承关系
五、GDB代码调试
- 使用命令 gcc -g *.c -o *生成带有调试信息的可执行程序
gcc -g hello.c -o hello
- 使用 gdb ./hello装入调试程序
- 使用run启动程序
- 添加断点
- 跟踪变量
Watch 变量:设置后,需要使用 continue(c)继续执行代码,如果watch变量发生变化,会自动打印出新值和旧值
Backtrace 最简单的是可以看到函数之间的调用关系。
六、后记
要搬新的办公室了,说了快两年了终于实现了,换个新环境,希望能够一切顺利,顺利发paper,顺利毕业,顺利找到好工作…