C / C ++编译。使用简单的makefile来解决项目问题

时间:2016-03-18 12:50:42

标签: c++ compilation makefile

我一直在研究这个makefile几个小时,似乎没有任何变化,但对我来说似乎完全没问题。也许我错过了一些基本的东西?

以下是目录的外观:

project
    makefile
    \obj
         checkInput.cpp
         olend.cpp
    \include
         checkInput.h

这是makefile:

I_DIR = include
OBJ_DIR = obj
CXX = g++
CXXFLAGS = -I$(I_DIR)

MAIN = olend
SRCS = checkInput.cpp

OBJ_SRCS = $(subst .cpp, .o, $(SRCS)), $(MAIN).o
OBJS = $(patsubst %, $(OBJ_DIR)/%, $(OBJ_SRCS))

DEP_SRCS = $(subst .cpp,.h,$(SRCS))
DEPS = $(patsubst %,$(I_DIR)/%,$(DEP_SRCS))

all: $(MAIN)

$(MAIN): $(OBJS)
    $(CXX) $(CXXFLAGS) -o $(MAIN) $(OBJS)

$(OBJ_DIR)/%.o: %.cpp $(DEPS)
    $(CXX) $(CXXFLAGS) -o $@ $<

.PHONY: clean

clean:
    rm -f $(OBJ_DIR)/*.o $(MAIN)

我正在寻找一个可执行文件“olend”,我目前得到的错误是,

"No rule to make target 'obj/olend.o,', needed by `olend'.  Stop."

这是非常直接的错误,但我不明白这是怎么回事, $(OBJ_DIR)/%.o 应该包含obj/olend.o作为目标。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

如果你仔细查看错误消息,它会说它找不到的目标是'obj / olend.o,' - 注意最后的额外逗号。这来自您定义OBJ_SRCS变量的方式。它应该是这样的:

OBJ_SRCS = $(subst .cpp,.o, $(SRCS)) $(MAIN).o

请注意.o之前没有空格(这导致它生成checkInput .o等文件名)并且$(MAIN)部分之前没有逗号(这会导致它生成类似这样的内容) :checkInput.o, olend.o)。