Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OBJECTS=$(SOURCES:.cpp=.o)`在makefile中是什么意思_C++_Linux_Makefile - Fatal编程技术网

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

C++ OBJECTS=$(SOURCES:.cpp=.o)`在makefile中是什么意思,c++,linux,makefile,C++,Linux,Makefile,我正在看这个,它是这样的 # File names EXEC = run SOURCES = $(wildcard *.cpp) OBJECTS = $(SOURCES:.cpp=.o) ..... %.o: $(SRCPATH)/%.cpp $(INC) $(CC) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ 及 它说,第二种情况只有在.cpp文件存在时才有效,因为它们不存在,因此无法工作。我的问题是为什么第一个有效 问题2: “通配符*”

我正在看这个,它是这样的

# File names
EXEC = run
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)    

.....
%.o: $(SRCPATH)/%.cpp $(INC)
    $(CC) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

它说,第二种情况只有在.cpp文件存在时才有效,因为它们不存在,因此无法工作。我的问题是为什么第一个有效

问题2:
“通配符*”是什么意思?
最后一条语句
OBJECTS=$(SOURCES:.cpp=.o)
的意思是什么

问题3: 当%.o作为目标时,它是什么意思?两者之间有什么区别
*.o
%.o
通配符*.cpp

您所有的问题都可以通过阅读

GNU Make手册中关于的部分值得一读,因为我相信该页的作者试图解释不使用
*.cpp
,因为它可能无法实现您想要的功能。(然而,作者指出,由于裸glob而忽略修改时间是完全错误的。)

该部分继续到关于
通配符
函数的部分。这只是一个make expanded globbing函数,用于控制扩展时间(变量定义时间而不是变量使用时间)

$(来源:.cpp=.o)
是一个

%.o
作为目标是一个

*.o
是一个glob

$(通配符*.cpp)
(非
通配符*.cpp
)已在前面介绍过

SOURCES = $(*.cpp)
SOURCES = *.cpp
SOURCES = $(wildcard *.cpp)
第一个是错误,第二个扩展太晚(不在定义上),第三个搜索源目录中后缀为.cpp的所有文件。
内置函数
通配符用于强制进行通配符扩展,但这种扩展不是自然发生的

OBJECTS = $(SOURCES:.cpp=.o)
这意味着在将项目末尾的每个
.cpp
替换为
.o
后,将为
对象
分配
的值

%.o
作为目标意味着您正在定义从其他对象创建
.o
的规则

参考资料:


请参见此处,了解一个好的基本生成文件:

该页面的意思是
*.cpp
而不是
$(*.cpp)
<代码>$(*.cpp)不正确。此外,该页面似乎所说的关于
*.cpp
的内容也不正确。目标%.o是否适用于找到的所有.o文件。我的意思是,如果有6,o个文件,这将被调用6次?它适用于make需要生成的所有.o文件(not:did(not)find)。不管怎么说,这条规则太复杂了,不好用。
SOURCES = $(*.cpp)
SOURCES = *.cpp
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)