Error: "Mixed implicit and static pattern rules" in my Makefile
Error: "Mixed implicit and static pattern rules" in my Makefile
我有一个适用于小型 C++ 应用程序的工作 Makefile
,它在一个文件夹中只有几个源代码文件,该文件夹也是输出文件夹。现在我试图将源和 object 文件和 运行 分开成一个问题。这就是我的 makefile 现在的样子,我将在下面详细说明问题发生的位置。
CC = gcc
CXX = g++
RM = del
TARGET = plox.exe
CFLAGS = -Wall -ggdb -O3 $(INCLUDE)
CXXFLAGS = -std=c++11 -Wall -ggdb -O3 $(INCLUDE)
LDFLAGS = $(LIB) -lglfw3 -lopengl32 -lglu32 -lgdi32
INCLUDE = -I$(GLFW_INC) -I$(GLAD_INC)
LIB = -L$(GLFW_LIB)
SRC_DIR = src
BUILD_DIR = build
GLFW_DIR = d:/external/glfw-3.1
GLFW_INC = $(GLFW)/include
GLFW_LIB = $(GLFW)/lib64
GLAD = d:/external/glad-c
GLAD_INC = $(GLAD)/include
CXX_SOURCES = $(SRC_DIR)/%.cpp
CXX_OBJS = $(addprefix $(BUILD_DIR)/, $(CXX_SOURCES:.cpp=.o))
OBJS = $(CXX_OBJS) $(BUILD_DIR)/glad.o
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
$(CXX_OBJS): %.o: $(SRC_DIR)%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(BUILD_DIR)/glad.o: src/glad.c
$(CC) -c $(CFLAGS) -c -o $(BUILD_DIR)/glad.o $(SRC_DIR)/glad.c
.PHONY: clean
clean:
$(RM) $(TARGET) $(OBJS)
问题在行:
$(CXX_OBJS): %.o: $(SRC_DIR)/%.cpp
在我更改之前,它看起来像这样:
$(CXX_OBJS): %.o: %.cpp
一位朋友帮我提供了一个模板,但我一直不知道那一行到底是做什么用的。在 another thread 中我了解到这是一个 静态模式规则 所以我想这是我犯错误的地方。但是现在写下来,我想错误可能已经更早了。我在定义 $(CXX_OBJS)
时可能犯了错误。会不会是那个列表中的 object 的形式是 build/src/test.o
而不是 build/test.o
?
但是我怎样才能修复 addprefix
行以产生正确的输出?标题中的错误从何而来?我在哪里混合那些?我认为这可能与静态模式规则中的 $(SRC_DIR)
有关,因为我可能误解了它的工作原理,但忽略它并不会消除错误。此外(假设 CXX_OBJS
稍后工作正常),如果静态模式规则检查列表 $(CXX_OBJS)
中的每个文件是否与 %.o
匹配,然后对同一文件具有依赖性以 .cpp
结尾,那也是不正确的,因为 build
文件夹前缀。
总而言之,我对如何正确处理文件夹前缀感到非常困惑,非常感谢任何建议!
在静态模式规则中,第一部分(目标)中的词必须是真实文件。 None 个可以包含模式 (%
)。你有:
CXX_SOURCES = $(SRC_DIR)/%.cpp
CXX_OBJS = $(addprefix $(BUILD_DIR)/, $(CXX_SOURCES:.cpp=.o))
$(CXX_OBJS): %.o: $(SRC_DIR)%.cpp
所以CXX_OBJS
是$(BUILD_DIR)/$(SRC_DIR)/%.o
,其中包含一个模式,所以这是非法的。
我真的不知道你想用 CXX_SOURCES
做什么。也许你想要:
CXX_SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
代替?
除了之外,我的Makefile
中还有一个错误是通过重命名变量引入的:mingw32-make
找不到-lglfw3
部分,因为我使用了$(GLFW)
在 GLFW_INC
和 GLFW_LIB
的定义中,但没有定义它。我想用 $(GLFW_DIR)
代替。
我有一个适用于小型 C++ 应用程序的工作 Makefile
,它在一个文件夹中只有几个源代码文件,该文件夹也是输出文件夹。现在我试图将源和 object 文件和 运行 分开成一个问题。这就是我的 makefile 现在的样子,我将在下面详细说明问题发生的位置。
CC = gcc
CXX = g++
RM = del
TARGET = plox.exe
CFLAGS = -Wall -ggdb -O3 $(INCLUDE)
CXXFLAGS = -std=c++11 -Wall -ggdb -O3 $(INCLUDE)
LDFLAGS = $(LIB) -lglfw3 -lopengl32 -lglu32 -lgdi32
INCLUDE = -I$(GLFW_INC) -I$(GLAD_INC)
LIB = -L$(GLFW_LIB)
SRC_DIR = src
BUILD_DIR = build
GLFW_DIR = d:/external/glfw-3.1
GLFW_INC = $(GLFW)/include
GLFW_LIB = $(GLFW)/lib64
GLAD = d:/external/glad-c
GLAD_INC = $(GLAD)/include
CXX_SOURCES = $(SRC_DIR)/%.cpp
CXX_OBJS = $(addprefix $(BUILD_DIR)/, $(CXX_SOURCES:.cpp=.o))
OBJS = $(CXX_OBJS) $(BUILD_DIR)/glad.o
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
$(CXX_OBJS): %.o: $(SRC_DIR)%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(BUILD_DIR)/glad.o: src/glad.c
$(CC) -c $(CFLAGS) -c -o $(BUILD_DIR)/glad.o $(SRC_DIR)/glad.c
.PHONY: clean
clean:
$(RM) $(TARGET) $(OBJS)
问题在行:
$(CXX_OBJS): %.o: $(SRC_DIR)/%.cpp
在我更改之前,它看起来像这样:
$(CXX_OBJS): %.o: %.cpp
一位朋友帮我提供了一个模板,但我一直不知道那一行到底是做什么用的。在 another thread 中我了解到这是一个 静态模式规则 所以我想这是我犯错误的地方。但是现在写下来,我想错误可能已经更早了。我在定义 $(CXX_OBJS)
时可能犯了错误。会不会是那个列表中的 object 的形式是 build/src/test.o
而不是 build/test.o
?
但是我怎样才能修复 addprefix
行以产生正确的输出?标题中的错误从何而来?我在哪里混合那些?我认为这可能与静态模式规则中的 $(SRC_DIR)
有关,因为我可能误解了它的工作原理,但忽略它并不会消除错误。此外(假设 CXX_OBJS
稍后工作正常),如果静态模式规则检查列表 $(CXX_OBJS)
中的每个文件是否与 %.o
匹配,然后对同一文件具有依赖性以 .cpp
结尾,那也是不正确的,因为 build
文件夹前缀。
总而言之,我对如何正确处理文件夹前缀感到非常困惑,非常感谢任何建议!
在静态模式规则中,第一部分(目标)中的词必须是真实文件。 None 个可以包含模式 (%
)。你有:
CXX_SOURCES = $(SRC_DIR)/%.cpp
CXX_OBJS = $(addprefix $(BUILD_DIR)/, $(CXX_SOURCES:.cpp=.o))
$(CXX_OBJS): %.o: $(SRC_DIR)%.cpp
所以CXX_OBJS
是$(BUILD_DIR)/$(SRC_DIR)/%.o
,其中包含一个模式,所以这是非法的。
我真的不知道你想用 CXX_SOURCES
做什么。也许你想要:
CXX_SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
代替?
除了Makefile
中还有一个错误是通过重命名变量引入的:mingw32-make
找不到-lglfw3
部分,因为我使用了$(GLFW)
在 GLFW_INC
和 GLFW_LIB
的定义中,但没有定义它。我想用 $(GLFW_DIR)
代替。