0

我有这个 Makefile:

CFLAGS = -c -Wall
CC = g++
EXEC = main
SOURCES = main.cpp listpath.cpp Parser.cpp
OBJECTS = $(SOURCES: .cpp=.o)
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

all: $(SOURCES) $(OBJECTS)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm $(OBJECTS) $(EXECUTABLE)

请注意:

  • 我在目录“。”中。其中包含生成文件
  • 文件夹“./src”已存在,并包含所有 .h 和 .cpp 文件
  • 文件夹“./obj”不存在,我希望 makefile 创建它并将所有 .o 放在那里

我得到的错误是:

No rules to build "main.cpp", necessary for "all". Stopping.

帮助!

4

2 回答 2

1

好的,从顶部开始:

CFLAGS = -c -Wall
CC = g++
# EXEC = main never used, not needed
SOURCES = main.cpp listpath.cpp Parser.cpp

到目前为止,一切都很好。请注意,这SOURCES没有提到DIR_SRC,因此我们稍后必须建立该连接(并且$(DIR_SRC)$(SOURCES)不会工作,因为路径必须附加到列表的每个成员)。但OBJECTS确实需要路径(例如/obj/main.o):

OBJECTS = $(patsubst %.cpp, $(DIR_OBJ)%.o, $(SOURCES))
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

(我个人不喜欢将斜杠放在变量中,但这只是个人喜好问题。)第一个目标是默认目标,因此它应该构建您真正想要构建的内容:

all: $(EXECUTABLE)

不要担心将来源列为先决条件;他们稍后会自行解决。

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@  # <-- note the automatic variable $^

约定在.cpp.o这里实际上不起作用。我们必须把它拼出来。我们必须告诉 Make 搜索$(DIR_SRC)文件.cpp

$(OBJECTS): $(DIR_OBJ)%.o: %.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@

$(DIR_OBJ):
    mkdir $@

vpath %.cpp $(DIR_SRC)

并告诉 Make 这clean不是一个真正的目标,只是为了安全起见:

.PHONY: clean
clean:
    rm $(OBJECTS) $(EXECUTABLE)

编辑:

我不应该一步尝试这么多。让我们尝试一些更简单的方法:

$(DIR_OBJ)%.o: $(DIR_SRC)%.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@
于 2012-09-16T04:06:39.330 回答
0

编辑SOURCES以包含源目录(例如src/main.cpp等)。

对于目标文件,请考虑如下内容:

OBJECTS = $(subst src/,obj/,$(SOURCES:%.cpp=%.o))

# ...

all: $(SOURCES) build

.PHONY: build
build: pre_build $(EXECUTABLE)

.PHONY: pre_build
pre_build: obj

obj:
    -mkdir obj

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@
于 2012-09-16T03:43:53.683 回答