几个制作文件问题

a couple of Makefile issues

本文关键字:文件 问题 几个      更新时间:2023-10-16

我有这个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.

帮助!

好的,从顶部开始:

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 $@

编辑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 $@