在linux平台上,最常用的编译系统就是gcc。在使用gcc编译程序时,编译程序可以被分为四个阶段:
第一步:预处理(所有以#开头头的文件都展开) 操作命令:gcc -E test.c -o test.i;
第二步:编译 (语法检查) 操作命令:gcc -S test.i -o test.s;
第三步:汇编 (把汇编语句翻译成CPU可识别的二进制文件) 操作命令:gcc -c tset.s -o test.o;
第四步:链接 (把test.o文件和函数数据库文件链接在一起) 操作命令:gcc test.o -o test;
这时输入“./test”即可执行该文件。
gcc遵循的在本文章中的部分规则: .c为后缀的文件,C语言源代码文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
以上是使用gcc进行编译的步骤,然而在实际的开发过程中,仅仅使用gcc命令对程序进行编译是非常低效的,主要有下面两个原因:
(1)每个程序往往都是由多个源文件组成,源文件数量越多,执行的时间就会越长,此外,各种编译规则也会大大加深gcc命令行的复杂度,所以开发调试程序过程中,通过gcc命令来执行编译程序是很麻烦的。
(2)在整个开发过程中,调试工作占了整体工作量的一大半,在使用gcc开发调试过程中,使用gcc会把没有修改的源文件一起编译,这样会影响编译的效率。
为了提高编译效率,这就谈到了标题中所写的另一个Make工程管理器中Makefile文件。makef文件执行分为下面三个步骤:
(1)需要生成的目标文件(target file);
(2)生成目标文件所需要的依赖文件(dependency file);
(3)生成目标文件的编译规则命令行(command);
make是如何工作的:
1. 输入make,make会在当前目录下寻找“Makefile”或者“makefile”一般来说最好写成“Makefile”。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
3. 如果test文件不存在,或是test所依赖的后面的 test.o 文件的文件修改时间要比test这个文件新,那么,他就会执行后面所定义的命令来生成test这个文件。
4. 如果edit所依赖的test.o文件也存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果找到则再根据那一个规则生成test.o文件。
5. make会生成test.o 文件,然后再用test.o 文件声明make的终极任务,也就是执行文件test了。
编写Makefile文件:(注:object代表变量)
1 CC = gcc
2 target = test
3 object = test.o
4 $(target):$(object)
5 $(CC) $(object) -o $(target)
再输入运行命令make即可完成编译。
清空目标文件规则:
最稳得做法是
PHONY:clean
clean:rm -rf test $(object)