从零开始,编写Makefile。
目录
1.Makefile编写框架
1.1最简格式:
目标:依赖 //目标可以是中间文件、可执行文件、标签
指令 //shell指令,起始用tab
例程1.1:
//编写test.c,打印test
#include <stdio.h>
void main()
{
printf("test\n");
}
//编写Makefile文件
test:test.c
gcc -o test test.c
//在终端编译运行
$make
$./test
1.2关联格式:
最终目标:依赖(中间文件1 中间文件2 ···)
指令
目标1(中间文件1):依赖(中间文件1.1 中间文件1.2 ···)
指令
目标2(中间文件2):依赖(中间文件2.1 中间文件2.2 ···)
指令
···
例程1.2:
//编写test.h
#include <stdio.h>
void test1(void);
void test2(void);
//编写test1.c
#include "test.h"
void test1(void)
{
printf("test1\n");
}
//编写test2.c
#include "test.h"
void test2(void)
{
printf("test2\n");
}
//编写main.c
#include "test.h"
void main()
{
test1();
test2();
}
main调用了test1.c和test2.c的函数,根据依赖关系写Makefile如下
main:main.o test1.o test2.o
gcc main.o test1.o test2.o -o main
main.o:main.c test.h
gcc -c main.c -o main.o
test1.o:test1.c test.h
gcc -c test1.c -o test1.o
test2.o:test2.c test.h
gcc -c test2.c -o test2.o
在终端中编译运行,结果如下
$make
$./main
test1
test2
1.3删除结果
如果要删除编译结果,需要增加以下指令
.PHONY:clean
clean:
rm -rf *.o main
至此,已经完成了一个Makefile文件的框架,接下来就是在框架内增加细节。
2.Makefile添加变量
2.1自定义变量
自定义变量格式为:变量名=值;使用时$(变量名);
赋值符号有所扩充
赋值符号 | 说明 |
:= | 简单赋值,赋值操作只进行一次 |
= | 递归赋值,赋值操作进行多次,递归影响所有相关变量。 |
+= | 追加赋值 |
采用自定义变量,修改Makefile:
OBJ=main.o test1.o test2.o
main:$(OBJ)
gcc $(OBJ) -o main
main.o:main.c test.h
gcc -c main.c -o main.o
test1.o:test1.c test.h
gcc -c test1.c -o test1.o
test2.o:test2.c test.h
gcc -c test2.c -o test2.o
.PHONY:clean
clean:
rm -rf *.o main
自定义变量类似宏定义,减少了代码修改的耗时。
2.2自动化变量
变量 | 说明 |
$@ | 此目标 |
$^ | 此目标的所有依赖 |
$< | 此目标的第一个依赖 |
改进上一个Makefile为:
OBJ=main.o test1.o test2.o
main:$(OBJ)
gcc -o $@ $^
main.o:main.c test.h
gcc -o $@ -c $<
test1.o:test1.c test.h
gcc -o $@ -c $<
test2.o:test2.c test.h
gcc -o $@ -c $<
.PHONY:clean
clean:
rm -rf *.o test
自动化变量简化了Makefile代码。