博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
makefile(04)_函数
阅读量:5734 次
发布时间:2019-06-18

本文共 2501 字,大约阅读时间需要 8 分钟。

9.函数定义及调用

Makefile中支持函数的概念,make解析器提供了一系列函数供Makefile使用。同时可以自定义函数。

9.1.自定义函数

在Makefile中支持自定义函数的实现,并调用执行,通过define关键字来实现自定义函数。

函数定义的语法规则:
makefile(04)_函数
自定义函数的本质:
1.自定义函数其实是一个多行变量,无法直接调用;通过call 关键字来使用(call的作用就是将实参替换到函数体对应的位置)
2.自定义函数是一种过程调用,没有任何的返回值;
3.用于定义命令集合,并应用于规则中。
示例:

.PHONY : testdefine func1    @echo "My name is $(0)"endefdefine func2    @echo "My name is $(0)"    @echo "Param 1 => $(1)"    @echo "Param 2 => $(2)"endefvar := $(call func1)new := $(func1)test :    @echo "new => $(new)"    @echo "var => $(var)"    $(call func1)  #@echo My name is func1    $(call func2, D.T.Software, delphi_tang)

输出结果:

makefile(04)_函数

9.2.预定义函数

Make的函数提供了处理文件名,变量和命令的函数,可以在需要的地方调用函数来处理指定的参数,函数再调用的地方被替换为处理结果。

预定义函数的调用:
makefile(04)_函数
为什么自定义函数和预定义函数的调用形式完成不同?
本质上,Makefile不支持真正意义上的自定义函数,自定义函数本质上是多行变量,预定义的call函数在调用时将参数传递给多行变量,自定义函数时call函数的参数,并在call中被执行。
示例:

.PHONY : testdefine func1    @echo "My name is $(0)"endefdefine func2    @echo "My name is $(0)"endefvar1 := $(call func1)var2 := $(call func2)var3 := $(abspath ./)var4 := $(abspath test.cpp)test :    @echo "var1 => $(var1)"    @echo "var2 => $(var2)"    @echo "var3 => $(var3)"    @echo "var4 => $(var4)"

输出结果:

makefile(04)_函数

10.变量与函数的综合运用

10.1.实战需求:

自动生成target文件夹存放可执行程序,生成objs文件夹存放编译生成的目标文件(*.o)

支持调试版本的编译选择(通过预编译宏实现),考虑代码的扩展性(自定义变量)

10.2.工具原料:

$(wildcard _pattern),获取当前工作目录中满足_pattern的文件或者目录

$(addprefix _prefix _name),给名字列表_name中的每一个名字增加前缀_prefix

10.3.关键技巧:

1.自动获取当前目录下的源文件列表(函数调用),SRCS := $(wildcard *.c)

2.根据文件列表生成目标文件列表(变量指定替换)OBJS := $(SRCS:.c=.o)
3.对每一个目标文件列表加上路径前缀(函数调用)OBJS := $(addprefix path/, $(OBJS))
规则中的模式替换:
这两种模式替换的区别在于,后者的模式替换目标来自于一个变量var,前者的目标来自一个指定的文件夹。
makefile(04)_函数makefile(04)_函数
编译规则的依赖:
makefile(04)_函数
最终程序:

CC := gccMKDIR := mkdirRM := rm -frDIR_OBJS := objsDIR_TARGET := targetDIRS := $(DIR_OBJS) $(DIR_TARGET)TARGET := $(DIR_TARGET)/hello-makefile.out# main.c const.c func.cSRCS := $(wildcard *.c)# main.o const.o func.oOBJS := $(SRCS:.c=.o)# objs/main.o objs/const.o objs/func.oOBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)).PHONY : rebuild clean all$(TARGET) : $(DIRS) $(OBJS)    $(CC) -o $@ $(OBJS)    @echo "Target File ==> $@"$(DIRS) :    $(MKDIR) $@# 针对当前文件下的工作目录进行模式替换$(DIR_OBJS)/%.o : %.c    ifeq ($(DEBUG),true)        $(CC) -o $@ -g -c $^     else           $(CC) -o $@ -c $^    endifrebuild : clean allall : $(TARGET)clean :    $(RM) $(DIRS)

源文件main.c

extern void foo();int main(){        foo();        return 0;}

源文件const.c

const char* g_hello = "hello makefile";
源文件func.c

#include "stdio.h"extern char* g_hello;void foo(){        printf("void foo() : %s\n", g_hello);}

输出结果

makefile(04)_函数

转载于:https://blog.51cto.com/11134889/2108193

你可能感兴趣的文章
Go 的吉祥物,萌不萌
查看>>
Java 的swing.GroupLayout布局管理器的使用方法和实例
查看>>
Android中Activity和Fragment的生命周期的对比
查看>>
C++Primer_笔记_异常处理
查看>>
分区交换 alter table exchange partition 在线表 历史表交换
查看>>
思科三层交换 HSRP 热备 配置方法
查看>>
zabbix详解:(二)添加被监控机器
查看>>
设计模式单列
查看>>
人像模式的灯光效果?iPhone 8开挂袭来
查看>>
Linux下MongoDB安装与配置
查看>>
DSL配置(PPPOA)
查看>>
WEBRTC执行流程
查看>>
Spring Boot 入门系列
查看>>
Spring Cloud版——电影售票系统<六>使用 Spring Cloud Config 统一管理微服务配置
查看>>
Java not support java EE1.3
查看>>
iptables规则备份及恢复、firewalld九个zone,service的操作
查看>>
www.conf配置文件的参数详解
查看>>
如何实现邀请好友帮抢票功能?
查看>>
深圳联通特邀湖北籍企业参观公司总部大楼举行
查看>>
告警系统主脚本、告警系统配置文件、告警系统监控项目
查看>>