/*main.c*/ #include "mytool1.h" #include "mytool2.h" #include <stdio.h> int main(int argc,char *argv[]) { mytool1_print("hello"); mytool2_print("hello"); } /*mytoo1.h*/ #ifndef _MYTOOL1_H #define _MYTOOL1_H void mytool1_print(char *print_str); #endif /*mytool1.c*/ #include "mytool1.h" void mytool1_print(char *print_str) { printf("This is mytool1 print %s\n",print_str); } /*mytool2.h*/ #ifndef _MYTOOL2_H #define _MYTOOL2_H void mytool2_print(char *print_str); #endif /*mytool2.c*/ #include "mytool2.h" void mytool2_print(char *print_str) { printf("This is mytool2 print %s\n",print_str); }
我们可以这么编译链接这个程序:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o myprint main.o mytool1.o mytool2.o
这样之后只需执行命令"./myprint",便可以简单的运行这个程序。
但是当我们修改了其中的一个文件之后是不是还要不厌其烦的输入上面的编译命令?
为了解决这一问题,我们有个好方法去解决,那就是编写一个makefile文件,用make命令去编译上面的程序。
执行命令"vim Makefile”
编写如下代码:
main: main.o mytool1.o mytool2.o [Tab]gcc -o myprint main.o mytool1.o mytool2.o main.o: main.c mytool1.h mytool2.h [Tab]gcc -c main.c mytool1.o: mytool1.c mytool1.h [Tab]gcc -c mytool1.c mytool2.o: mytool2.c mytool2.h [Tab]gcc -c mytool2.c
保存后执行命令“make -f Makefile”
这样也可以生成一个可执行程序。
有了这个Makefile文件之后,无论我们修改什么地方,只要make一些这个文件,就可以轻松的生成可执行文件。
在Makefile中#开始的行为注释行,此文件的一般格式为:
(target目标):(components依赖对象)
【Tab制表符按键】(rule规则)
第一行为依赖关系,比如上面那个Makefile文件的第一行,我们的目标main的依赖对象为main.o、mytool1.o和mytool2.o
第二行为执行规则,当依赖的对象在目标修改后修改的话,就要执行规则这一行所指定的命令,注意,这一行开头必须是Tab键。
上面的make里的-f参数表示寻找到名为Makefile的文件进行make,因为make只能自动识别名为makefile或者Makefiile两个文件,如果你编译的
makefile文件名为my_makefile的话,就需要加上-f参数,否则make无法找到你指定的my_makefile文件。
此外,makefile里面还有三个非常有用的变量:$@(目标文件)、$^(所有的依赖文件)和$<(第一个依赖文件)
如果使用这三个变量,我们的Makefile文件可以简化为:
main: main.o mytool1.o mytool2.o [Tab]gcc -o $@ $^ main.o: main.c mytool1.h mytool2.h [Tab]gcc -c $< mytool1.o: mytool1.c mytool1.h [Tab]gcc -c $< mytool2.o: mytool2.c mytool2.h [Tab]gcc -c $<
最后,相信大家都已经看出来了吧,其实makefile的文件就是一个递归的过程。