Makefile学习笔记08|makefile函数使用wildcard自动添加

Makefile学习笔记08|Makefile函数使用wildcard自动添加

  希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。

  这里是目录

函数简介

  我们先从Makefile自带的函数开始学习。

  • wildcard - 查找指定目录下的指定类型的文件。
    • 展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
    • SRC=$(wildcard *.cpp *.cc)
  • patsubst - 匹配替换
    • 格式:$(patsubst,, )
    • 名称:模式字符串替换函数——patsubst。
    • TMP= ( p a t s u b s t (patsubst %.cpp,%.o, (patsubst(SRC))

wildcard函数

  之前生成项目时,所有的.o文件都需要我们手动罗列出来,也就是给OBJS变量赋值。如果我们想让要写出一个通用的Makefile模板,就需要自动化地罗列.o等文件。那我们为什么不干脆用通配符‘*’呢?使用通配符不利于进一步配置,所以通常使用wildcard函数。
  Makefile函数的使用方法为:
返回值=$(函数名 [参数1],[参数2],[...])
  参数间需要使用逗号隔开。所以SRC=$(wildcard *.cpp .cc)中的.cpp *.cc)是一个参数,而不是两个参数。我们重做一个项目来测试。路径为~/make/src/test_make_func/。创建一个名为main.cpp的文件和相应的Makefile文件。实验目的是看一下函数wildcard的返回值。

// main.cpp
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	cout<<"test make function"<<endl;
	return 0;
}
# Makefile
SRC:=$(wildcard *.cpp)
all:
	echo $(SRC)

  输入命令:make all,结果如下:

echo main.cpp
main.cpp

  再加两个文件,xdata.cpp、sdata.h。

// xdata.cpp
#include "xdata.h"
#include "iostream"
XData::XData()
{
	std::cout<<"Create XData\n";
}
// xdata.h
class XData
{
public:
	XData();
};

  输入命令make all,结果如下:

echo xdata.cpp main.cpp
xdata.cpp main.cpp

  修改一下main.cpp与Makefile测试一下调用XData。

// main.cpp
#include <iostream>
#include "xdata.h"
using namespace std;
int main(int argc,char* argv[])
{
	XData d;
	cout<<"test make function"<<endl;
	return 0;
}
# makefile
TARGET=test_make_func
SRC:=$(wildcard *.cpp)
$(TARGET):$(SRC)
	$(CXX) $^ -o $@
#all:
#	echo $(SRC)

  输入命令make测试一下,再./test_make_func。结果如下:

g++ xdata.cpp main.cpp -o test_make_func
Creat XData
test make function

  如果我们想把编译过程分拆开来,把编译与链接分开,进而写出通用的Makefile文件,就要把SRC变量中的.cpp改成.o。这就需要今天的第二个函数——patsubst()。

patsubst函数

  OBJS:= ( p a t s u b s t (patsubst %.cpp,%.o, (patsubst(SRC))的含义就是把变量SRC中的任意.cpp改成.o。Makefile改写如下:

# Makefile
TARGET=test_make_func
SRC:=$(wildcard *.cpp)
OBJS:=$(patsubst %.cpp,%.o,$(SRC))
$(TARGET):$(OBJS)
	$(CXX) $^ -o $@
#all:
#	echo $(SRC)

  以后我们可以将这个Makefile重复利用来管理许多不同的项目,只需修改TARGET即可。以后还要将此Makefile做成一个头文件供其他Makefile文件调用。

  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: makefile中的wildcard函数是一个用于查找文件的函数。它可以在makefile使用通配符来查找指定目录下的文件,并将结果返回给makefile。例如,$(wildcard *.c)将查找当前目录下所有以.c结尾的文件,并将它们返回给makefile。这个函数makefile中非常有用,可以帮助我们自动化构建过程中的文件查找和处理。 ### 回答2: makefilewildcard函数是常用的函数之一,它能够返回指定文件夹下的所有符合指定规则的文件名,并返回这些文件名列表。wildcard函数通常用于指定需要编译的文件名,也可以用于反复使用的文件名列表中。 wildcard函数的一般语法为: $(wildcard PATTERN),其中PATTERN表示要匹配的文件名规则。 wildcard函数返回的是一个由匹配的文件名组成的列表,可以使用变量来存储这个列表。 例如,假设要编译source文件夹下所有以.c为后缀的文件,可以在makefile使用以下代码: ``` SRC_FILES=$(wildcard ./source/*.c) gcc -o program $(SRC_FILES) ``` 这里,wildcard函数返回了source文件夹下所有以.c结尾的文件名列表,保存在变量SRC_FILES中,然后使用gcc命令编译所有这些文件,并生成一个名为program的可执行文件。 可以使用通配符'*'和'?'在PATTERN中指定通配符规则,'*'表示任意多个字符,'?'表示一个任意字符。例如,'*.c'匹配所有以.c结尾的文件名,'?abc.c'匹配所有第二个字符为a,后面紧接着abc.c的文件名。 可以使用多个wildcard函数来匹配多个不同的文件规则和文件夹。示例代码如下: ``` C_FILES=$(wildcard ./source/*.c) ASM_FILES=$(wildcard ./assembly/*.s) OBJ_FILES=$(wildcard ./obj/*.o) gcc -o program $(C_FILES) $(ASM_FILES) $(OBJ_FILES) ``` 在这个例子中,C_FILES变量匹配source文件夹下所有以.c结尾的文件名,ASM_FILES变量匹配assembly文件夹下所有以.s结尾的文件名,OBJ_FILES变量匹配obj文件夹下所有以.o结尾的文件名。这些变量被用来编译生成一个名为program的可执行文件。 在组织大型项目或使用复杂的目录结构时,使用makefilewildcard函数可以大大简化makefile文件的编写,提高工作效率。 ### 回答3: makefile 是一种用来自动化编译软件的工具,其中 wildcard 函数是其实现过程中的一个重要函数。在 makefile 中,通配符是一种惯用手法,它可以帮助我们在编译程序时,方便快捷地匹配文件和目录,避免了手动输入冗长的文件名的麻烦。而 wildcard 函数则是用来扩展通配符的,使其能够匹配更多的文件和目录。 wildcard 函数的语法格式为 $(wildcard pattern),其中 pattern 表示通配符表达式,函数会将其匹配的所有文件和目录以空格分隔的字符串列表形式返回给 makefile。例如,$(wildcard *.c) 将会匹配所有以 .c 后缀结尾的文件,并将其返回成字符串列表形式。 Wildcard 函数的实用性非常高,在 makefile使用中应用广泛。通过 wildcard 函数,我们可以对文件进行过滤和筛选,便于其它函数的处理。例如,在 makefile 编译程序时,我们经常需要对指定目录下的特定文件进行编译操作,而此时使用 wildcard 函数就可以很方便地获取指定目录下所有符合指定格式的文件名,然后传递给 make 工具来编译。 此外,wildcard 函数还可以与其它函数组合使用,比如与 foreach 函数一起使用,可以将通配符扩展得更细致、更智能化。比如,我们可以使用 foreach 函数遍历所有符合条件的文件,然后对它们依次执行编译操作,这样就能够实现更加灵活、强大的操作了。 总的来说,wildcard 函数makefile使用中非常实用,它能够帮助我们更快捷地获取指定的文件和目录列表,方便程序的编译和处理。因此,在学习使用 makefile 时,我们一定要重视 wildcard 函数的掌握和使用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值