简介
makefile用于工程构建和管理,在makefile文件内定义编译和链接规则,通过命令即可进行工程的构建。
在Ubuntu环境下开始学习makefile的使用,记录基础操作。
makefile文件编写有固定的语法,学习makefile语法可发参考跟我一起写MakeFile网页版 Github
单个文件夹下的makefile
新建一个文件夹,在文件夹内创建main.c child.c child.h makefile
文件,编译产生的中间文件都放在这个目录下
child.h
#ifndef _CHILD_H
#define _CHILD_H
#include <stdio.h>
void child_show(int num);
#endif
child.c
#include "child.h"
void child_show(int num)
{
printf("Child show %d",num);
}
main.c
#include "child.h"
int main(void)
{
printf("main run,next is child\r\n");
child_show(255);
printf("\r\n");
return 0;
}
makefile
# 选择编译器
CC=gcc
CFLAGS=-g -O2 -Wall
# 链接生成执行文件main,依赖 main.o 和 child.o
main:main.o child.o
${CC} main.o child.o -o main
# 编译生成main.o,依赖 main.c 和 child.h
main.o:main.c child.h
${CC} ${CFLAGS} -c main.c
# 编译生成child.o,依赖child.c 和 child.h
child.o:child.c child.h
${CC} ${CFLAGS} -c child.c
.PHONY : clean
# 清除编译产生的文件
clean :
@echo 清除编译结果
-rm -f *.o main
多文件makefile
当文件较多时可能会分文件夹存储,比如创建文件夹bin src inc obj
,bin文件用于放置链接的执行文件,src文件夹放置源码文件,inc文件放置Header文件,obj放置编译产生的文件。以单文件夹的文件为例,把main.c child.c
放到src文件夹,child.h
放到inc文件夹,文件内容不变,修改makefile内容
# 设置目录变量
DIR_SRC=./src
DIR_INC=./inc
DIR_OBJ=./obj
DIR_BIN=./bin
# 设置可执行文件
TARGET=main
BIN_TARGET=${DIR_BIN}/${TARGET}
# 配置源文件和 .o 文件
SRC=$(wildcard ${DIR_SRC}/*.c)
OBJ=$(patsubst %.c, ${DIR_OBJ}/%.o, $(notdir ${SRC}))
# 设置编译器和头文件路径(-I指定.h文件路径)
CC=gcc
CFLAGS=-g -O2 -Wall -I${DIR_INC}
# 链接生成可执行文件
${BIN_TARGET}:${OBJ}
${CC} ${OBJ} -o $@
# 编译,使用 % 进行匹配
${DIR_OBJ}/%.o:${DIR_SRC}/%.c
${CC} ${CFLAGS} -o $@ -c $<
.PHONY : clean
# 清除可执行文件和编译文件
clean :
@echo 清除编译结果
-rm -f ${BIN_TARGET} ${OBJ}