Makefile 简单整理

前言

之前对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)

暂无评论

Hi

发表评论