这两种说法有什么区别?
我都跑了。 % 给出的名称替换为 .o 但 * 不会改变任何内容,只是给出相同的 cc 文件。有人告诉我两者是相同的,但显然不是。
什么时候用什么?
CXX_OBJECTS = $(patsubst $(SOURCE_DIR)/%.cc, $(BUILD_DIR)/%.o, $(CXX_SOURCES))
CXX_OBJECTS = $(patsubst $(SOURCE_DIR)/*.cc, $(BUILD_DIR)/*.o, $(CXX_SOURCES))
GNU make 在一些地方使用了 glob 风格的模式。您可以在需要目标名称或先决条件的地方或调用内置 $(wildcard) 函数时使用它们。基本的全局通配符运算符是 *、? 和 [...]。这些允许您指定与零个或多个实际现有文件名匹配的模式。
但是,当 GNU make 需要将一个文件名转换为另一个文件名时(例如,发现“foo.o”的源文件是“foo.c”),它使用“%”,这是它自己的内部通配符,就像一个通配符“*”,匹配零个或多个字符。
$(patsubst) 对文本进行操作。 GNU make 无意将其任何参数视为应该检查文件系统的文件通配符。它期望找到 % 模式和 % 替换。很容易混淆,因为“*”和“%”在模式方面表示相同的意思:匹配零个或多个字符。
记住的一种方法是,glob 样式模式 (*/?/[]) 意味着创建与这些模式匹配的实际文件名列表,即实际检查文件系统以查找匹配项。另一方面,% 意味着根本不检查文件系统,并且还意味着您可能会在某些替换文本中使用与 % 匹配的片段(例如通过隐式规则)。