makefile的使用场景
makefile用于编译大量的.c文件 或者是分文件编写的(包含多个 .h 多个.c文件 和主文件 ) 将其转换为可执行文件 。 makefile的作用正是简化了上面的步骤,makefile的使用前提是掌握gcc 然后循序掌握其他内容
1 - 从简单的gcc 操作 到 转换为makefile
如我们要将 main.c 变为可执行文件 main
需要经历 gcc -E gcc -S gcc -C
当然对于单个.c文件转变为可执行文件 我们可以直接使用
gcc -C main.c -o main
在makefile中
main : main.c
gcc -c main.c -o main
main 是目标文件 ,main.c是依赖文件 下面必须用tab键 开头书写命令(若命令不存在的话则无需)
说明 : makefile中 目标文件一定要有 ,但依赖文件 和命令列表 可以没有
目标 :就是你要产生的文件,可以是 obj 文件
执行顺序
编写一个makefile 文件
binggo :test test2
echo "hello all"
test:
echo "hello test"
test2:
echo "hello test2"
makefile 默认会以文件中的第一个目标为最终目标 也就是 这里的 binggo, binggo 目标有两个依赖,test 和test2 .同样test 和test2 也作为目标 ,但他们不存在依赖文件。
执行顺序: 先执行依赖 test ,再执行依赖 test2 ,在依赖满足后 执行目标文件
可以使用 make makefile -n 来看一下执行过程
echo "hello test"
echo "hello test2"
echo "hello all"
再看多个.c文件编写的情况
提供 add.c mul.c sub.c add.h mul.h sub.h test.c 要求 将他们变为可执行文件
其中的函数形式为:
/*add.c*/
#include"add.h"
int add (int x,int y)
{
return x+y;
}
/*mul.c*/
#include"mul.h"
int mul (int x,int y)
{
return x*y;
}
/*sub.c*/
#include"sub.h"
int sub (int x,int y)
{
return x-y;
}
/*test.c*/
#include "add.h"
#include "sub.h"
#include "mul.h"
#include
int main(void)
{
int x=2;
int y=4;
printf("%d",add(x,y));
printf("%d",sub(x,y));
printf("%d",mul(x,y));
printf("hello");
return 0;
}
/*add.h*/
#ifndef __ADD_H__
#define __ADD_H__
int add (int x,int y);
#endif /*__ADD_H__*/
/*mul.h*/
#ifndef __MUL_H__
#define __MUL_H__
int mul (int x,int y);
#endif /*__MUL_H__*/
/*sub.h*/
#ifndef __SUB_H__
#define __SUB_H__
int sub (int x,int y);
#endif /*__SUB_H__*/
使用gcc 的方式:
gcc add.c sub.c mul.c test.c -o test
说明:由于这里头文件和 多个c文件在同一个 目录下,所以不需要使用 -I 指定头文件
使用 makefile的方式
test: add.c sub.c mul.c test.c
gcc add.c sub.c mul.c test.c -o test
此时 目标文件test依赖 test: add.c sub.c mul.c test.c 所有c文件
首先确保程序已经执行一次(产生test可执行文件),然后我们对 add.c做一下修改(比如 使用touch add.c 更新一下时间戳)
然后再执行一下 make -n 执行顺序如下
gcc add.c sub.c mul.c test.c -o test
可见他会把所有的 .c文件全部在执行一次。
解决办法
当存在多个 c文件时,我们需要借助 c 文件生成的 obj文件(.o文件)
修改makefile
test:add.o sub.o mul.o test.o
gcc add.o sub.o mul.o test.o -o test
add.o:add.c
gcc -c add.c -o add.o
mul.o:mul.c
gcc -c mul.c -o mul.o
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
clean:
rm *.o
当我们的 add.c被修改之后, 目标 add.o 就会重新被执行 ,重新被执行的命令也就只有被修改的那部分
同样的我们在已经执行过一次的前提下,touch add.c ,表示add.c 被更新
然后使用 make -n展示编译过程
gcc -c add.c -o add.o
gcc add.o sub.o mul.o test.o -o test
(可见:我们使用.o 文件的目的是为了:当存在多个 . c文件时 , 我们若针对特定几个 .c文件 修改 ,make只会重新编译我们修改过后的那几个.c文件 ,并不会全部编译 ,这样就能节省时间 ,后续会谈到)