【发布时间】:2020-11-17 22:48:35
【问题描述】:
这是错误:
g++ -lpthread -pthread -std=c++11 -g -D_GNU_SOURCE src/QuoridorMain.o src/Tree.o src/utility.o src/Game.o src/storage.o -o qbot
/usr/bin/ld: error: src/QuoridorMain.o: file too short
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: qbot] Error 1
这是我正在使用的 Makefile。
# Makefile for qbot
# Compiler options
CXX = g++ # use g++ compiler
CXXFLAGS = -lpthread -pthread -std=c++11 -g -D_GNU_SOURCE -no-pie# openmp and pthread, g for debugging
.SUFFIXES: .o .cpp
OFILES = src/QuoridorMain.o src/Tree.o src/utility.o src/Game.o src/storage.o
qbot: $(OFILES)
$(CXX) $(CXXFLAGS) $(OFILES) -o qbot
@echo Produced qbot executable
clean:
$(RM) *.o *~
# Dependency rules for *.o files
src/Tree.o: src/Tree.cpp src/Tree.h src/utility.cpp src/Global.h
src/QuoridorMain.o: src/QuoridorMain.cpp src/Tree.cpp src/Game.cpp src/Global.h
src/utility.o: src/utility.h src/utility.cpp src/Global.h
src/Game.o: src/Game.cpp src/Game.h src/Global.h
src/storage.o: src/storage.cpp src/storage.h
我不是很擅长确定 makefile 中什么是必要的,什么是杂乱无章的,而链接器错误通常是我的失败。话虽这么说,这之前编译得很好,我认为在完美编译和这个错误之间唯一改变的是添加了一些 std::cout 语句。所以我很不知道发生了什么。
也许相关的东西:与我开发大部分代码的计算机相比,我正在一台新计算机上进行编译,并且之前遇到了 ld 相关错误,我通过添加 -no-pie 标志修复了该错误。但是,这对我来说是有意义的,即使删除 -no-pie 标志现在也会得到相同的编译错误。另外:我的代码运行时可能存在重大错误。早些时候,根据某些std::cout 语句是否被注释掉,我在运行期间得到段错误或非段错误。有人告诉我这是其他地方出现重大问题的迹象,但如果您能具体说明这些问题通常是什么,以及它们现在将如何影响编译而不仅仅是运行时,我将非常感激。谢谢!
编辑:根据评论者的建议,我已从 .o 依赖规则中取出所有 .cpp 文件。在make clean 之后,我仍然收到同样的错误。我怀疑我需要做更多的事情才能让它真正工作,而不是仅仅删除 .cpp 文件,但这似乎不是直接的问题。
【问题讨论】:
-
您的 cpp 文件不应依赖于其他 cpp 文件。除此之外,如果你
make clean,问题会消失吗? -
您永远不会将 C++ 文件编译为目标文件。
-
不,
make clean没有帮助。是否有特定的最佳实践可以帮助强制执行无 cpp 依赖项?我不久前就这样做了,不记得确切的原因,但当时它确实奏效了。 -
哦,呵呵。您的
make clean不会删除src中的文件。您可能应该将该配方更改为rm -f $(OFILES)。make -B src/QuoridorMain.o产生什么?那应该无条件地重新制作该文件。 -
@Botje 这很尴尬。这似乎是问题所在。我仍然不确定问题出在哪里,或者为什么它之前工作,但似乎自项目开始以来我还没有做过真正的
make clean。有没有办法将评论标记为正确?谢谢!
标签: c++ makefile linker g++ ld