makefile练习

简介

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
");
	child_show(255);
	printf("
");

	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}

原文地址:https://www.cnblogs.com/niu-li/p/13125679.html