作者: 江淼 Blog: http://blog.csdn.net/jiangfriend 时间: 2007-6-27 18:28 makefile对于溺于IDE下的朋友们一定接触的不多,因为IDE把建立makefile的任务一手包办了,但常期以往沉浸于IDE的溺爱是对发展非常不利的,特别是在unix下和makefile打交道是更为普遍,所有学会写makefile是非常有必要的。 在IDE下,系统之所以能井然有序的对众多源代码进行编译和链接,是因为IDE很明确的告诉系统先做什么而后做什么。而makefile就是一个传播这些信息媒介,而我们现在的目标抛离IDE的怀怉,返璞归真。 这里是官方make参考文档中makefile一章,关于makefile的方方面面可谓是面面惧到,非常适合看到E文不头疼的朋友和即使头疼也要看的朋友http://www.gnu.org/software/make/manual/make.html#Makefiles 准备工具和文件 hello.c
#include int main(int argc,char* argv[]) { printf("hello world\n"); return 0; }当hello.c输入完成后,我们要对hello.c进行编译,需要执行 gcc hello.c
当makefile建立完成后放至hello.c所在的文件夹,执行make,看看发现了什么。
make执行了gcc hello.c成功的完成了编译我们回首分析那个makefile发现执行单元由3个部分组成 <目标名称>:<需要的文件> <命令> 我们对makefile进行改写,以更能容易描述这三个单元
#次简单的makefile hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o删除目录下的hello.o后再执行make后发现了什么? 系统执行了 gcc -c hello.c -o hello.o gcc hello.o -o hello 对比makefile我们很容易发现hello的建立过程为 hello <- hello.o <- hello.c 自己在MAC上进行了编写非常OK的。
其中碰到的问题是当自己完全copy makefile文件到vs CODE 进行使用TABBLE空格键进行排版。
接着进行编译的时候,提示语法错了, 提示***missing separate. Stop
出现这个原因是vi上的table和vs code上的table不一样的。window编译器是在自动让所有的文件进行编译和链接了。
对于Linux系统来说,需要进行手动写makefile,手动让文件进行编译和链接的。使用上面这样的方式进行代码编译是非常好的。
对单个文件大家可能没有体会到优势,那么我们新引入一个func.c 与 func.h 文件并修改hello.c
/*hello.c*/ #include "func.h" int main(int argc,char* argv[]) { func(); return 0; } /*func.c*/ #include "func.h" void func(void) { printf("hello world\n"); } /*func.h*/ #ifndef _FUNC_H #define _FUNC_H #include void func(void); #endif并修改相应的makefile为
#任务二的makefile hello: hello.o func.o gcc hello.o func.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o func.o: func.c func.h gcc -c func.c -o func.o运行make后输出
gcc -c hello.c -o hello.o gcc -c func.c -o func.o gcc hello.o func.o -o hello执行过程为 hello<-hello.o<-hello.c ^--func.o<-hello.c 通过任务一和任务二,我相信大家一对makefile最最基本的规则有了个明确的了解。不过这仅仅只是序幕。下一章我们将使用make的特性开始对makefile修改,以简化和自动化我们书写代码的过程。 makefile相比较c来讲还是相当的简单的个单元
#次简单的makefile hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o删除目录下的hello.o后再执行make后发现了什么? 系统执行了 gcc -c hello.c -o hello.o gcc hello.o -o hello 对比makefile我们很容易发现hello的建立过程为 hello <- hello.o <- hello.c
对单个文件大家可能没有体会到优势,那么我们新引入一个func.c 与 func.h 文件并修改hello.c
/*hello.c*/ #include "func.h" int main(int argc,char* argv[]) { func(); return 0; } /*func.c*/ #include "func.h" void func(void) { printf("hello world\n"); } /*func.h*/ #ifndef _FUNC_H #define _FUNC_H #include void func(void); #endif并修改相应的makefile为
#任务二的makefile hello: hello.o func.o gcc hello.o func.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o func.o: func.c func.h gcc -c func.c -o func.o运行make后输出
gcc -c hello.c -o hello.o gcc -c func.c -o func.o gcc hello.o func.o -o hello执行过程为 hello<-hello.o<-hello.c ^--func.o<-hello.c 通过任务一和任务二,我相信大家一对makefile最最基本的规则有了个明确的了解。不过这仅仅只是序幕。下一章我们将使用make的特性开始对makefile修改,以简化和自动化我们书写代码的过程。 makefile相比较c来讲还是相当的简单的