简单了解makefile

制作makefile

如何编写makefile
gcc/g++与makefile
makefile介绍
如何写好一个makefile

main.c

#include "mytool1.h"
#include "mytool2.h"
int main(){
        mytool1_print("hello mytool1!");
        mytool2_print("hello mytool2!");
        return 0;
}

mytool1.c

#include "mytool1.h"
#include <stdio.h>
void mytool1_print(char *print_str){
        printf("This is mytool1 print:%s",print_str);
}

mytool1.h

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

mytool2.c

#include "mytool2.h"
#include <stdio.h>
void mytool1_print(char *print_str){
        printf("This is mytool1 print:%s",print_str);
}

mytool2.h

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

Makefile

简单的makefile

main : main.c mytool1.c mytool2.c mytool1.h mytool2.h
        gcc -o main $^

$<:第一个依赖文件
$@:目标
$^:所有不重复的依赖文件,以空格分开​

在这里插入图片描述
任何文件只要稍微做了修改就需要整个项目完整的重要编译。

生成中间文件的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
.PHONY : clean
clean :
        rm -rf *.o

只对修改过的文件进行重新编译
在这里插入图片描述

测试:

1. Makefile中交换main.o与mytool1.o之间的位置

在这里插入图片描述
总的编译执行顺序还是一样。

2. 修改makefile第一条关系

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
结论:makefile的第一条关系是makefile的最终目标,生成最终目标之后,makefile就结束了

makefile执行顺序的理解

makefile第一条命令是“最终目标”。根据最终目标的依赖,找到源头(堆栈),然后判断是否需要重新编译(出栈)。

如: A依赖B,B依赖C
A->B->C
那么,makefile根据依赖,建立依赖关系链表。先判断B是否需要重新编译(C是否更改),然后再判断A。
对于上面例子,建立了如下的关系:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LittleSeedling/article/details/106059652
今日推荐