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))
- 格式:$(patsubst,,
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文件调用。
都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ