为什么要写makefile?

很多的年轻程序员从学programming开始接触的便是功能强大的IDE, 只要写好header files 和 source files, 一键就能生成可执行文件. 但是作为一个professional, makefile的概念不能不清楚, 所以我就动手探究了下为什么我们要写makefile. 至于怎么写好makefile,请参考http://bbs.chinaunix.net/viewthread.php?tid=408225 .

 

我们使用4个文件来说明这个问题

--main.c

--func.h

--func.c

--hello.c

 

1. func.h 该头文件声明了一个变量和两个方法

#ifndef Func_H #define Func_H int i; void foo(); void hello(); #endif

 

2. func.c 该文件实现了foo()方法

#include "func.h" void foo() { i=5; }

 

3. hello.c 该文件实现了hello()方法

#include "func.h" #include <stdio.h> void hello() { printf("hello world/n"); }

当然此处不必一定要include <func.h> hello.c可以直接定义方法hello(), 但是为了养成好的编程风格最好规范coding.

 

4. main.c

#include <stdio.h> #include "func.h" int main() { hello(); foo(); printf("i=%d/n",i); }

 

如果main中没有第三方的lib (即只用库中定义好的变量和函数),那么大可以 gcc -o main main.c 就能得到可执行文件. 当然这是简化了过程, 第一步是编译 gcc -c main.c 第二步是link成可执行文件, gcc -o main main.o. 如果简化成一步完成你就不会看到main.o文件了.

 

如果用了第三方的lib, 比如我们这边定义了的foo()等, 那么一般只有三种方法编译链接成可执行文件. (这里单独gcc -o main main.c就不能搞定了)

 

1. 把所有用到的文件都include进来,这是最粗鲁的方法,也就是main文件变成

#include <stdio.h> #include "func.h" #include "func.c" int main() { hello(); foo(); printf("i=%d/n",i); }

然后gcc -o main main.c 就能生成可执行文件, 这种方法非常不提倡用.

 

2. 在gcc命令中写进所有要用到的source file

即 gcc -o main main.c func.c hello.c, 如果项目很大,几万个source file, 怎么办?

 

3. 手动喽~~先编译 后链接

gcc -c main.c

gcc -c func.c

gcc -c hello.c

gcc -o main main.o hello.o func.o

 

当然你也可以这样

gcc -c func.c

gcc -c hello.c

gcc -o main main.c hello.o func.o

 

当然也能这样

gcc -c hello.c

gcc -o main main.c hello.o func.c

 

在极端就到第二种方法了...

 

所以现在应该明白为什么需要makefile了吧, 本例子的makefile如下

main: main.o func.o hello.o main.o: func.h func.o: func.h hello.o: func.h clean: rm *.o main

 

 

 

你可能感兴趣的:(为什么要写makefile?)