Mikefile的编写:
假设源代码如下:
/*main.c*/
#include "mytool1.h"
#include "mytool2.h"
int main(void){
mytool1_print("Hello");
mytool2_print("Hello");
}
/*mytool1.h*/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/*mytool2.h*/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char * print_str);
#endif
/*mytool1.c*/
#include "mytool1.h"
#include <stdio.h>
void mytool1_print(char *print_str){
printf("This is print in mytool1:%s",print_str);
}
/*mytool2.c*/
#include <stdio.h>
#include "mytool2.h"
void mytool2_print(char * print_str){
printf("This is print in mytool2:%s",print_str);
}
将以上到源文件编译:
gcc -c mytool1.h mytool2.h
gcc -c mytool1.c mytool2.c
gcc -c main.c
gcc -o main main.o mytool1.o mytool2.o
完成时候产生可执行到文件:main
但是这样做显然很麻烦,试想,如果一个项目中有成千上万到源文件,那么要执行多少遍gcc命令啊?
这个问题显然难不倒聪明到程序员们。
他们发明来一种文件,用来一次性到编译源文件,这个文件就是Makefile,在Linux中使用工具make就可以运行这个文件(当然,前提是我们写出了Makefile文件)
在终端输入:$vim Makefile之后,编写Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
注意分割符是tab
完成时候,在控制台输入:make就可以一次性编译所有到源文件
终端输出:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
之后用ls命令查看文件,会发现,多出来链接文件和可执行文件,好了,成功!
下面详细说明Makefile中到规则:
在Makefile中#用来注释。
Makefile中最终到是描述文件格式到说明:一般格式为:
target : components
TAB rule
第一行表示依赖关系,第二行表示规则
如main:main.o mytool1.o mytool2.o
说明目标文件mian要依赖main.o mytool1.o mytool2.o,
然后根据第二行到规则去执行,gcc main.c,注意TAB是一个分割符,TAB键
另外,Makefile文件中有三个非常有用的变量:$@,$< ,$>,分别表示为目标文件,第一个依赖文件,所有到依赖文件
这样,上面到文件就可以写成:
main:main.o mytool1.o mytool2.o
gcc -o $@ $>
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<