MakeFile 实战入门

1、什么是MakeFile

Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。

温馨提示:Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。

2、MakeFile 语法规则

目标...: 依赖...
    相关编译命令1
    相关编译命令2
    ...

 目标:目标即要生成的可执行文件。

 依赖:程序目标文件由哪些依赖文件生成。

相关编译命令: 通过执行该命令,由依赖文件生成目标文件。 

3、MakeFile 项目实例

实例项目:创建一个学生管理系统由学生模块、教师模块、班级模块和main.c 程序入口构成。

学生模块:

#include<stdbool.h>

bool add();
bool del();
int  totals();
#include<stdbool.h>
#include<stdio.h>
#include "student.h"

bool add(){
    printf("学生添加成功\n");
    return true;
}

bool del(){
    printf("学生删除成功\n");
    return true;
}

int totals(){
    return 0;
}

教师模块:

#include<stdbool.h>
bool addT();
bool delT();
int  totalsT();
#include<stdbool.h>
#include<stdio.h>
#include "teacher.h"

bool addT(){
    printf("老师添加成功\n");
    return true;
}

bool delT(){
    printf("老师删除成功\n");
    return true;
}

int totalsT(){
    return 0;
}

教室模块:

#include<stdbool.h>

bool addC();
bool delC();
int  totalsC();
#include<stdbool.h>
#include<stdio.h>
#include "classroom.h"

bool addC(){
    printf("班级添加成功\n");
    return true;
}

bool delC(){
    printf("班级删除成功\n");
    return true;
}

int totalsC(){
    return 0;
}

程序入口:

#include "student.h"
#include "teacher.h"
#include "classroom.h"

int main(void){
    add();
    del();
    totals();

    addT();
    delT();
    totalsT();

    addC();
    delC();
    totalsC();
    return 0;
}

编写的初级版本的makefile 文件:

stuSys : main.o student.o teacher.o classroom.o
	gcc -g -o stuSys main.o student.o teacher.o classroom.o
main.o : main.c
	gcc -g -c main.c -o main.o
student.o : student.c
	gcc -g -c student.c -o student.o
teacher.o : teacher.c
	gcc -g -c teacher.c -o teacher.o
classroom.o : classroom.c
	gcc -g -c classroom.c -o classroom.o

clean: 
	rm -rf stuSys main.o student.o teacher.o classroom.o  

编译并执行:

wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code/学习管理系统$ make
wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code/学习管理系统$ ./stuSys
学生添加成功
学生删除成功
老师添加成功
老师删除成功
班级添加成功
班级删除成功

 个人认为这个初级版本的makefile 弱爆了。

初级版本->基础版本的makefile 文件:

OBJS = main.o student.o teacher.o classroom.o
CC = gcc
CFLAGS = -g
TARGET = stuSys1

$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^
$(OBJS): %.o :%.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:  
	rm -rf $(TARGET) $(OBJS)

4、MakeFile 函数

wildcard 函数

实例:

SOURCES = $(wildcard *.c)  

功能说明:匹配目录下所有的 .c 文件,并将其赋值给 SOURCES变量。 

patsubst 函数

实例:

OBJS = $(patsubst %.c,%.o,$(SOURCES))  

功能说明:取出 SOURCES中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJS变量 。

5、MakeFile 变量

我这里仅仅讲解我在makefile 文件中使用的变量。

1. $@

表示规则中目标。

2. $<

表示规则中的第一个依赖条件。

3. $^

表示规则中的所有依赖条件。

6、MakeFile 代码清理

清理 make 命令所产生的所有文件。

7、MakeFile 伪目标

防止编译文件名称与make 命令重名情况。

基础版本->功能版本makefile 文件:

SOURCES = $(wildcard *.c)  
OBJS = $(patsubst %.c,%.o,$(SOURCES))  
CC = gcc
CFLAGS = -g
TARGET = stuSys2

$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^
$(OBJS): %.o :%.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:  
	rm -rf $(TARGET) $(OBJS)

针对:功能版本makefile 文件进行详细功能说明:

#匹配目录下所有的 .c 文件,并将其赋值给 SOURCES变量
SOURCES = $(wildcard *.c)  
#取出 SOURCES中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJS变量 
OBJS = $(patsubst %.c,%.o,$(SOURCES))  
CC = gcc
CFLAGS = -g
TARGET = stuSys2

# 要生成名为 $(TARGET) 的目标文件(或可执行文件),需要依赖于 $(OBJS) 变量所指定的所有源文件(或目# 标文件),即 $(OBJS) 中列出的所有文件都需要先编译生成,然后链接到 $(TARGET) 文件中。
$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^

# 使用编译器 $(CC) 和编译选项 $(CFLAGS) 将每个 .c 源文件编译为对应的 .o 目标文件,并使用 $< 和 $@ # 分别表示规则中的依赖文件和目标文件。
$(OBJS): %.o :%.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:  
	rm -rf $(TARGET) $(OBJS)

MakeFile 教程推荐:菜鸟教程

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值