我正在讨论这个tutorial,它有类似的东西
# File names
EXEC = run
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
.....
%.o: $(SRCPATH)/%.cpp $(INC)
$(CC) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
我不确定我是否理解该文件,如果有人能够解释最后两个陈述,我将不胜感激。以下是关于Makefile的三个问题
问题1:
之间的区别是什么
SOURCES = $(wildcard *.cpp)
和
SOURCES = $(*.cpp)
它说第二种情况只有.cpp文件存在才有效,因为它们不存在因此它不会工作。我的问题是为什么第一个有效?
问题2:
'wildcard *'
是什么意思?
最后一句话OBJECTS = $(SOURCES:.cpp=.o)
是什么意思?
问题3:
当它作为目标放置时,%.o意味着什么?什么区别
*.o
,%.o
和wildcard *.cpp
答案 0 :(得分:5)
SOURCES = $(*.cpp)
SOURCES = *.cpp
SOURCES = $(wildcard *.cpp)
第一个是错误,第二个是扩展太晚(不是定义),第三个搜索源目录中带有后缀.cpp的所有文件。
内置函数wildcard
用于强制通配符扩展,它不会自然发生。
OBJECTS = $(SOURCES:.cpp=.o)
这意味着在用OBJECTS
替换项目末尾的每个SOURCES
后,.cpp
被赋予.o
的值。
%.o
作为目标意味着您要定义一条规则,用于从其他内容创建.o
。
参考文献:GNU make manual
请在此处查看基本的makefile:https://stackoverflow.com/a/26579143
答案 1 :(得分:1)
通过阅读GNU Make Manual,您的所有问题都是可以回答的。
GNU制作手册中关于wildcards的部分值得一读,因为我认为该页面的作者试图解释不使用*.cpp
,因为它可能无法满足您的需求。 (作者指出忽略修改时间,因为裸露的全球是完全错误的。)
该部分继续介绍wildcard
函数的部分。这只是一个扩展的globbing函数来控制扩展时间(变量定义时间而不是可变使用时间)。
$(SOURCES:.cpp=.o)
是Substitution Reference
。
%.o
作为目标是Pattern Rule
。
*.o
是一个小球。
$(wildcard *.cpp)
(不是wildcard *.cpp
)之前已经介绍过了。