很多的年轻程序员从学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
当然此处不必一定要include
4. main.c
#include
如果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
然后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