错误:我的Makefile中的“混合隐式和静态模式规则”

时间:2015-02-28 20:20:38

标签: c++ windows c++11 makefile

我有一个工作Makefile用于小型C ++应用程序,它只在一个文件夹中包含几个源代码文件,这个文件夹也是输出文件夹。现在我试图分离源文件和目标文件并遇到问题。这就是我的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)时我可能犯了一个错误。可能是该列表中的对象的格式为build/src/test.o而不是build/test.o吗?

但是如何修复addprefix行以产生正确的输出?标题中的错误来自哪里;我在哪里混合那些?我认为这可能与静态模式规则中的$(SRC_DIR)有关,因为我可能误解了它是如何工作的,但省略它并不会使错误消失。此外(假设CXX_OBJS稍后正常工作),如果静态模式规则检查列表$(CXX_OBJS)中的每个文件是否与%.o匹配,然后依赖于同一文件结束.cpp,由于build文件夹前缀,这也是不正确的。

总而言之,我对如何正确处理文件夹前缀非常困惑,非常感谢任何建议!

2 个答案:

答案 0 :(得分:3)

在静态模式规则中,第一部分(目标)中的单词必须是真实文件。它们都不能包含模式(%)。你有:

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)

代替?

答案 1 :(得分:0)

除了@MadScientist的正确答案(我误解了%运算符的作用并且实际上想要wildcard代替),我在Makefile中通过重命名变量引入了另一个错误: mingw32-make无法找到-lglfw3部分,因为我在$(GLFW)GLFW_INC的定义中使用了GLFW_LIB,但没有定义它。我希望改为$(GLFW_DIR)