前言
之前对Makefile确实了解不多,只知道./configure;make;make install一气呵成。最近接触了一个工程,里面配置的环境有问题,只能手动解决环境的依赖,就简单整理一下用到的规则。
简介
Makefile最初解决的是C环境下的编译问题,但实际上是可以适应大多数环境的配置。
比如我们使用GCC在编译文件时,单文件的情况下我们可以使用
gcc main.c -o app
以下是gcc的常用参数
-I 头文件
-l 链接库文件
-o 指定输出
但是当遇到多文件或者环境依赖较多的情况下,这样手动在Shell环境里操作就会变得难以操作,甚至出错的概率增加。
规则
变量定义
直接采用赋值方法即可完成定义:
INCLUDE = ../include/
变量取值:
FOO = $(OBJ)
这里有几个比较通用的变量
CFLAGS:编译时需要使用的参数
LDFLAGS:链接库的使用
CC:gcc
自动变量
$@ --> 规则中的目标
$< --> 规则中的第一个依赖条件
$^ --> 规则中的所有依赖条件
app: main.c func1.c fun2.c gcc $^ - o $@
$^表示main.c func1.c fun2.c,$<表示main.c,$@表示app
例子
举个简单的例子,可以快速的帮我们理解。主要还是看结构,例子本身并不一定要用Makefile。
文件夹的结构如下
|-- main.c
|-- main.h
|-- print.c
|-- include
| |-- print.h
准备好以下文件后可以执行make
main.c:
#include "print.h"
int main() {
myPrint();
return 0;
}
print.h:
#include <math.h>
int myPrint();
print.c:
#include <stdio.h>
#include "print.h"
int myPrint(void) {
printf("Hello world! Pi:%f\n", M_PI);
return 0;
}
Makefile文件
CC=gcc
INCLUDE = ./include
CFLAGS=-I(INCLUDE)
LIBS=-lm
_DEPS = print.h
DEPS =(patsubst %, (INCLUDE)/%,(_DEPS))
OBJ = main.o print.o
%.o: %.c (DEPS)(CC) -c -o @< (CFLAGS)(LIBS)
app: (OBJ)(CC) -o @^ $(CFLAGS)