生成文件退出并出现致命错误
Makefile exits with fatal error
我有一个具有以下结构的项目:
$ 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
这应该是您所需要的。
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 在Raspbian上编译pybind11测试用例时出现致命错误
- 致命错误:特征/密集:VSC 中没有此类文件或目录
- v8::HandleScope::CreateHandle() # 中的致命错误无法在没有 HandleScope 的情
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 代码::块C++使用 MacOS 编译 Mojave : 致命错误: sys/cdefs.h: 没有这样的文件或目录
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- 链接:致命错误LNK1104:无法打开文件"python37_d.lib"
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 多次调用本机方法时出现致命错误
- 在 Windows 10 下使用 GTest 的 CMake - 致命错误 LNK1104:无法打开文件"gtest.lib",但存在调试"gtestd.lib"
- NMAKE:致命错误 U1077:cl.exe 和 nmake.exe 返回代码'0x2'
- 【MacOSX 10.15.1】使用 odb 生成数据库,致命错误:wchar.h:没有这样的文件或目录 #include < wchar.h>
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 生成文件退出并出现致命错误
- 将.exe转换为 .dll Win32 项目并防止在出现致命错误时退出