'file too short' 编译 .o 文件时 g++ 出错

'file too short' error on g++ when compiling .o file

这是错误:

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 文件,但这似乎不是正在发生的直接问题。

您写道目标文件依赖于您的 C++ 文件,但您没有包含从 C++ 文件生成目标文件的规则。您可以看到您从不使用 .cpp 文件参数调用 g++。我认为正在发生的事情是 make,没有看到规则,只是生成空对象文件。

核心问题是你的.o文件在过去的某个时候损坏了。

第二个问题是您的 clean 目标实际上并没有清理 OFILES,因为它只删除 *.o,而不是 src/*.o

## EDIT: removed -lpthread
CXXFLAGS = -pthread -std=c++11 -g -D_GNU_SOURCE -no-pie # openmp and pthread, g for debugging

OFILES = src/QuoridorMain.o src/Tree.o src/utility.o src/Game.o src/storage.o

## EDIT: Used $@ and $^ instead
qbot: $(OFILES)
    $(CXX) $(CXXFLAGS) $@ -o $^
    @echo Produced qbot executable 

## EDIT: fixed clean target and designated it as .PHONY, which stops Make from looking
## EDIT: for a file named "clean"
.PHONY: clean
clean: 
    $(RM) -f qbot $(OFILES) *~

## EDIT: Removed .cpp files from dependency list.
## EDIT: Keeping the similarly-named cpp files, even though they are redundant.
# Dependency rules for *.o files
src/Tree.o: src/Tree.cpp src/Tree.h src/Global.h
src/QuoridorMain.o: src/QuoridorMain.cpp src/Global.h
src/utility.o: src/utility.cpp src/utility.h src/Global.h 
src/Game.o: src/Game.cpp src/Game.h src/Global.h
src/storage.o: src/storage.cpp src/storage.h