makefile基础


好处:一次编写,终身受益
命名规则: makefileMakefile
三要素:目标、依赖、规则命令

1. makefile编写

写法:

目标(target): 依赖(prerequiries)...
	tap键 规则命令(command)
  • 目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。目标也可是一个执行的动作名称,诸如‘clean’(仅仅表达动作的目标称为假想目标)。
  • 依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。
  • 命令是make执行的动作,一个规则可以含有几个命令,每个命令占一行。

注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。这是不小心容易出错的地方。
makefile举例:

编写add.csub.ctest.h文件:
add.c

#include "test.h"
#include <stdio.h>
 
int add(int a, int b){
    return a + b;
}
 
int main(){
    printf(" 2 + 3 = %d\n", add(2, 3));
    printf(" 2 - 3 = %d\n", sub(2, 3));
    return 1;
}

sub.c

#include "test.h"
 
int sub(int a, int b){
    return a - b;
}

test.h

#ifndef _TEST_H
#define _TEST_H
 
int add(int a, int b);
int sub(int a, int b);
 
#endif

makefile

test: add.o sub.o
	gcc -o test add.o sub.o
 
add.o: add.c test.h
	gcc -c add.c
 
sub.o: sub.c test.h
	gcc -c sub.c    
 
clean:
	rm -rf test
	rm -rf *.o

2. 执行makefile文件

在命令行输入:

make

如果有多个makefile文件,需要指定makefile文件进行make,需要加参数-f

make -f Make_test

在这里插入图片描述

3. 高级makefile写法(重要)

目标:依赖
	规则命令

这里的规则命令有时可以省去不写,编译器自动推导。

规则这里可以添加@echo+语句命令,用来打印当前语句

规则前也可添加@符号,表示不打印此行规则。
规则添加-@符号,表示如果该命令报错,也要继续运行。
示例:

test: add.o sub.o
	@echo 创建测试程序
	@gcc -o test add.o sub.o
 
add.o: add.c test.h
sub.o: sub.c test.h 
 
clean:
	-@rm -rf test
	rm -rf *.o

在这里插入图片描述

(1)两个重要的函数:

wildcard:可以进行文件匹配
patsubst:内容的替换

(2)使用变量的方法:$(变量)

(3)使用通配符:%作为通配符
从匹配目标格式的目标名中依据通配符抽取部分字符串,再按照抽取字符串分配到每一个依赖格式中产生依赖名。例如,使用%.o:%.c


(4)$的搭配用法:

  • $@:目标
  • $^:全部依赖
  • $<:第一个依赖
  • $?:第一个变化的依赖
SrcFiles=$(wildcard *.c)                   #注释:可以得到所有的.c文件
ObjFiles=$(patsubst %.c,%.o,$(SrcFiles))   #把所有的.c文件替换成.o文件

.RHONY:clean       		#防止有歧义
all:app    				#伪目标

app:$(ObjFiles)
    gcc -o app $^
 
%.o:%.c               	#把每一个.c生成.o      
    gcc -o $@ -c $^		#此处$^可以更换为$<  
 
clean:
    rm -rf $(ObjFiles) app

gcc可以更换为$(CC)变量
一些参数(比如-fPIC)可以定义到$(CFLAGS)变量里

预定义变量
预定义变量是makefile已经定义好的变量,用户可以在makefile文件中改变变量的值。

  • 程序名变量
No.变量程序默认值
1CCC语言编译程序cc
2CXXC++编译程序g++
3ARC++打包程序ar
4CPP带有标准输出的C语言预处理程序$(CC) -E
5RM删除命令rm
  • 程序运行参数的变量
No.变量程序参数
1CFLAGS用于C编译器的额外标志
2CXXFLAGS用于C++编译器的额外标志
3ARFLAGS用于C/C++打包器的额外标志
4LDFLAGS链接库路径-L
5LDLIBS链接库-l

其他

  • 注释#
  • 换行\
  • 回显命令@echo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值