gcc编译器makefile笔记

1、使用到的函数

patsubst函数使用方法

可以替换名称。使用函数的时候,使用$()括起来,函数名 需要替换的内容,更替的内容,基于什么内容更替。例子如下:

#头文件目录
INCDIRS := inc
INCLUDE := $(patsubst %,-I%,$(INCDIRS))

#结果:
#INCLUDE = -Iinc

例子的意思是将变量INCDIRS里面的%(表示所有内容),更替为-I%(也就是在之前的内容的基础上在头部添加-I)。

dir函数的使用方法

获取带有相对or绝对路径的文件的路径。也就是相当于去掉文件信息,只要目录信息。

C_FILE := \
main.c \
src/print.c

C_DIRS :=$(dir $(C_FILE))

#终端输出结果:
#./ src/

C文件有main.c和src目录下的print.c文件,
使用函数以后,结果就变成了./ src/。

notdir函数的使用方法

去掉路径信息,之保留文件信息。

C_FILE := \
main.c \
src/print.c

C_NDIR :=$(notdir $(C_FILE))

#终端输出结果:
#main.c print.c

如图,去掉了路径信息,保留了文件信息。

2、解决了什么问题

输出路径

头文件变动,C文件重编译

3、目录结构以及代码

目录结构
main.c

#include "inc/print.h"

int main(void)
{
	print();
}

src下的print.c

#include "../inc/print.h"
#include "stdio.h"

void print(void)
{
    printf("%s\n",str);
}

inc下的print.h

#ifndef _PRINT_H
#define _PRINT_H

#define str "hes love"
void print(void);

#endif

makefile如下

CC := gcc
#生成程序名称
TARGET := temp
#存放中间
BUILD_DIR := build

#C文件以及相对目录
C_FILE := \
main.c \
src/print.c

#头文件目录
INCDIRS := \
inc

#头文件添加-I被编译器使用
INCLUDE := $(patsubst %,-I%,$(INCDIRS))
#C文件目录
C_DIRS :=$(dir $(C_FILE))
#C文件去掉目录信息
C_NDIR :=$(notdir $(C_FILE))
#需要生成的.o
C_OBJS :=$(patsubst %.c,$(BUILD_DIR)/%.o , $(C_NDIR) )
#生成依赖头文件存储文件
ALL_DEPENDS :=$(patsubst %.c,$(BUILD_DIR)/%.d,$(C_NDIR))
#设置C文件目录
VPATH := $(C_DIRS)

#伪变量
.PHONY:clean all
#创建存放中间文件的目录,以及生成可执行文件
all:$(BUILD_DIR) $(TARGET) 

#生成可执行文件
$(TARGET):$(C_OBJS)
	$(CC) -o $@ $^

#引用依赖的头文件
-include $(ALL_DEPENDS)

#将C_OBJS列表里面的.o按照要求编译出来,并且生成.d文件存储头文件依赖
$(C_OBJS):$(BUILD_DIR)/%.o:%.c
	$(CC) -c -MD $(INCLUDE) -o $@ $<

#创建中间文件存放的文件夹,-p表示存在就不重新创建了
$(BUILD_DIR):
	-mkdir -p $@

#清除中间文件,以及存放中间文件的文件夹
clean:
	-rm -rf $(BUILD_DIR)

首先利用函数,得到源文件的目录信息,和文件信息,使用变量存储起来。
源文件的目录信息是编译的时候进行自动寻找到C文件。
源文件的文件信息是生成文件的时候,全部的中间文件存放到一起。
VPATH的作用是自动寻找到源文件。是makefile自带的。
ALL_DEPENDS是利用GCC编译器生成依赖头文件的存放文件,后缀是.d,存放C文件依赖的头文件,在编译的时候加上-MD即可生成。
使用-include $(ALL_DEPENDS)导入.d文件

效果

输入make编译,然后运行生成的文件。
结果
更改print.h中的字符串之后重新编译。
重新编译的结果
运行结果
达到预期效果,本文到此结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值