生成文件退出并出现致命错误

Makefile exits with fatal error

本文关键字:致命错误 退出 文件      更新时间:2023-10-16

我有一个具有以下结构的项目:

$ tree
.
├── bin
├── include
│   └── reader.h
├── Makefile
├── obj
└── src
    ├── main.cpp
    └── reader.cpp
4 directories, 4 files

我想在src/中拥有.cpp文件,在include/中拥有标头,在obj/中编译对象文件,在bin/中编译可执行文件。我在 4.1 版中使用 GNU make,在 7.2.0 版中使用 g++ 和 Ubuntu 17.10。当我尝试构建它时(我尝试使用这里的想法,稍作修改(出现以下错误:

$ make
make: Circular obj/main.o <- obj/main.o dependency dropped.
make: Circular obj/reader.o <- obj/main.o dependency dropped.
make: Circular obj/reader.o <- obj/reader.o dependency dropped.
g++ -c -o obj/obj/reader.o include/reader.h 
In file included from <command-line>:0:0:
/usr/include/stdc-predef.h:1:0: fatal error: can’t create precompiled header obj/obj/reader.o: No such file or directory
 /* Copyright (C) 1991-2017 Free Software Foundation, Inc.
compilation terminated.
Makefile:15: recipe for target 'obj/reader.o' failed
make: *** [obj/reader.o] Error 1

我是制作文件的新手,所以我想这是非常基本的东西。我该如何解决这个问题?

编辑我忘记了制作文件'。来吧:

IDIR = include
OBJDIR = obj
CXX = g++
CXXFLAGS = -g -Wall -std=c++14 -I$(IDIR)
DEPS = reader.h
_DEPS = reader.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o reader.o
OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ))
$(OBJDIR)/%.o: $(OBJ) $(DEPS)
    $(CXX) -c -o $(OBJDIR)/$@ $< $(CFLAGS)
main: $(OBJ)
    $(CXX) -o $@ $^ $(CXXFLAGS)

编辑2 将语言更改为英语后,我理解了我的警告。 我从指令中删除了多余的$(OBJDIR)部分$(OBJDIR)/%.o结果是这样的:

IDIR = include
OBJDIR = obj
CXX = g++
CXXFLAGS = -g -Wall -std=c++14 -I$(IDIR)
DEPS = reader.h
_DEPS = reader.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o reader.o
OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ))
$(OBJDIR)/%.o: $(OBJ) $(DEPS)
    $(CXX) -c -o $@ $< $(CFLAGS)
main: $(OBJ)
    $(CXX) -o $@ $^ $(CXXFLAGS)

和新错误:

$ make
make: Circular obj/main.o <- obj/main.o dependency dropped.
make: Circular obj/reader.o <- obj/main.o dependency dropped.
make: Circular obj/reader.o <- obj/reader.o dependency dropped.
g++ -c -o obj/main.o obj/reader.o 
g++: warning: obj/reader.o: linker input file unused because linking not done
g++ -o main obj/main.o obj/reader.o -g -Wall -std=c++14 -Iinclude
g++: error: obj/main.o: No such file or directory
Makefile:18: recipe for target 'main' failed
make: *** [main] Error 1

$(OBJDIR)/%.o: $(OBJ) $(DEPS)没有意义。您是说每个对象文件都依赖于自身(以及所有其他对象文件(。这就是为什么制造在抱怨Circular obj/main.o <- obj/main.o dependency dropped.. $(OBJ)不应该在那里。

$(CXX) -c -o $@ $< $(CFLAGS)被破坏,因为$<是第一个先决条件,在这种情况下是 obj/reader.o .这就像您尝试将一个目标文件编译为另一个目标文件一样,这毫无意义。

另外,你为什么在这里使用$(CFLAGS)?您正在编译C++,因此它应该是$(CXXFLAGS)的(无论如何,您的代码永远不会设置CFLAGS(。

您的生成文件从未提及任何 cpp 文件。这是行不通的。


我会扔掉你的 Makefile,从简单的事情开始:

CXXFLAGS = -g -Wall -std=c++14 -Iinclude
bin/main: obj/main.o obj/reader.o
        $(CXX) -o $@ $(LDFLAGS) $+ $(LDLIBS)
obj/main.o: src/main.cpp include/reader.h
obj/reader.o: src/reader.cpp include/reader.h

这应该是您所需要的。

相关文章: