`OBJECTS = $(SOURCES:.cpp = .o)`在makefile中是什么意思

时间:2014-10-28 02:09:52

标签: c++ linux makefile

我正在讨论这个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%.owildcard *.cpp

2 个答案:

答案 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)之前已经介绍过了。