makefile文件的编写

makefile文件

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文件 ,并不会全部编译 ,这样就能节省时间 ,后续会谈到)


变量的介绍

你可能感兴趣的:(linux,makefile,git,github,嵌入式硬件,硬件工程,sql)