Makefile的简单使用以及高级用法

本文详细介绍了Makefile的概念、基本格式及使用步骤,包括如何编写C文件、H文件和Makefile,以及如何执行make命令。此外,还探讨了Makefile的高级用法,如利用变量控制和自动化变量,展示了如何通过自动化编译提升软件开发效率。
摘要由CSDN通过智能技术生成

一、概念

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

二、Makefile基本格式

target ... : prerequisites ...
    command
    ...
    ...
    
其中:
target        - 目标文件, 可以是 Object File, 也可以是可执行文件
prerequisites - 生成 target 所需要的文件或者目标
command       - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头

三、Makefile的简单使用步骤

需要的文件如下:
在这里插入图片描述

1、编写c文件

max.c

int max(int x,int y)
{
	if(x>y)
		return x;
	else
		return y;
}

min.c

int min(int x,int y)
{
	if(x>y)
		return y;
	else
		return x;
}

main.c

#include<stdio.h>
#include "max.h"
#include "min.h"
int main()
{
	int m,n;
	m = max(3,6);
	n = min(3,6);
	printf("max = %d\n,min = %d\n",m,n);
	return 0;	 
}

2、编写h文件

max.h

#ifndef __MAX_H  //如果宏未被定义,则编译下面的代码
#define __MAX_H  //定义宏

int max(int x,int y);

#endif     //结束一个#if…#else条件编译块

min.h

#ifndef __MIN_H
#define __MIN_H

int min(int x,int y);

#endif

3、编写Makefile

main:max.o min.o main.c		#main是要生成的可执行文件 后面是依赖文件 
	gcc min.o max.o main.c -o main	#编译命令
max.o:max.c	max.h		#max.o是要生成的目标文件  后面是依赖文件	  
	gcc -c max.c	#编译命令
min.o:min.c	min.h		#min.o是要生成的目标文件  后面是依赖文件	  
	gcc -c min.c	#编译命令

clean:		#执行make clean的时候要执行的命令
	rm -rf main *.o  #删除main(可执行文件)和所有的.o文件

4、make

在这里插入图片描述

5、清除make clean

在这里插入图片描述

四、Makefile高级用法

1.利用变量控制

$$ 打开makefile中定义的shell变量
$打开makefile中定义的变量
@命令将不被make回显出来

TARGET = main
CC = gcc
CFLAGS = -g
OBJS = max.o min.o main.c

$(TARGET):$(OBJS)
	$(CC) $(OBJS) -o $(TARGET)
max.o:max.c max.h
	$(CC) -c max.c
min.o:min.c min.h
	$(CC) -c min.c
clean:
	rm -rf $(TARGET) *.o

2.使用自动化变量

自动变量含义
$@表示规则中的目标文件集合
$%表示规则中的目标成员名
$<第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
$?比目标新的依赖目标的集合
$^所有依赖目标的集合, 会去除重复的依赖目标
#交叉编译工具链
#CC=arm-linux-gnueabihf-gcc
CC=gcc
#math(-lm)链接库
CFLAGS=-lm -lpthread

#获取全部的c文件
SrcFiles=$(wildcard *.c)

#使用替换函数获取.o文件(将所有.c文件转化为.o文件)
OBJS= $(patsubst %.c,%.o,$(SrcFiles))	

all:main
main:$(OBJS)
	$(CC) -o $@ $^ $(CFLAGS)
%.o:%.c
	$(CC) -c $< $(CFLAGS)
#定义伪目标,防止有歧义
.PHONY:clean all
clean:
	rm -rf $(OBJS)
	rm -rf main
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值