gpt4 book ai didi

c++ - 生成文件-.o : file not recognized: File truncated?

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:11 27 4
gpt4 key购买 nike

我刚开始学习 GNU make,但在使用 .d(依赖项)文件时遇到链接问题。谁能用这个错误指出我正确的方向:

...../part1.o: 文件无法识别:文件被截断
目标“bin/target/prog”的配方失败

这是一个简单的程序,包含:main.cpp、part1.cpp、part1.h、part2.cpp、part2.h

其中第 1 部分和第 2 部分有打印某些内容的方法。

这是运行 make 时来自终端的:

我不明白为什么我会收到使用 #pragma once 的警告?

stud@GoldenImageASE:~/Desktop/ISU/L1/2$ make ARCH=target -f Makefile.th
Compiling...part2.cpp
arm-devkit-g++ -MTbuild/target/part2.o -MM -I. part2.cpp > build/target/part2.d
Compiling...part1.cpp
arm-devkit-g++ -MTbuild/target/part1.o -MM -I. part1.cpp > build/target/part1.d
Compiling...main.cpp
arm-devkit-g++ -MTbuild/target/main.o -MM -I. main.cpp > build/target/main.d
object file....main.o
arm-devkit-g++ -I. -c main.cpp part1.h part2.h > build/target/main.o
part1.h:1:9: warning: #pragma once in main file
#pragma once
^
part2.h:1:9: warning: #pragma once in main file
#pragma once
^
object file....part1.o
arm-devkit-g++ -I. -c part1.cpp > build/target/part1.o
object file....part2.o
arm-devkit-g++ -I. -c part2.cpp > build/target/part2.o
arm-devkit-g++ -I. -o build/target/main.o build/target/part1.o build/target/part2.o -o prog
build/target/part1.o: file not recognized: File truncated
collect2: error: ld returned 1 exit status
Makefile.th:27: recipe for target 'bin/target/prog' failed
make: *** [bin/target/prog] Error 1

我的 Makefile 如下:

# Variables
SOURCES=main.cpp part1.cpp part2.cpp
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
EXE=prog
CXXFLAGS =-I.


# Making for host
# > make ARCH=host
ifeq (${ARCH},host)
CXX=g++
BUILD_DIR=build/host
EXE_DIR=bin/host
endif

# Making for target
# > make ARCH= target
ifeq (${ARCH},target)
CXX=arm-devkit-g++
BUILD_DIR=build/target
EXE_DIR=bin/target
endif

$(addprefix ${EXE_DIR}/,$(EXE)): $(addprefix ${BUILD_DIR}/,$(DEPS)) $(addprefix ${BUILD_DIR}/,$(OBJECTS))
# << Check the $(DEPS) new dependency
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) -o $(addprefix ${BUILD_DIR}/,$(OBJECTS))

$(addprefix $(BUILD_DIR)/, %.o): %.cpp
@echo "object file...."$*.o
$(CXX) $(CXXFLAGS) -c $^ > $@


# Rule that describes how a .d ( dependency ) file is created from a .cpp
# Similar to the assigment %. cpp -> %.o
${BUILD_DIR}/%.d: %.cpp
@mkdir -p $(dir $@)
@echo "Compiling..."$<
$(CXX) -MT$(@:.d=.o) -MM $(CXXFLAGS) $^ > $@

debug:
@echo "DEPS: "$(DEPS)"\n"
@echo "OBJ: " $(addprefix ${BUILD_DIR}/,$(OBJECTS))"\n"
@echo "EXE: " $(addprefix ${EXE_DIR}/,$(EXE))"\n"


.PHONY:clean
clean:
rm -f $(EXE) $(addprefix ${BUILD_DIR}/,$(DEPS)) $(addprefix ${BUILD_DIR}/,$(OBJECTS))

ifneq ($(MAKECMDGOALS),clean)
-include $(addprefix ${BUILD_DIR}/,$(DEPS))
endif

最佳答案

您有两个不相关的问题。第一个是链接时有两个相互冲突的 -o 选项。

你问的实际问题是不同的,但仍然与 -o 选项有关:即你在尝试创建目标文件时没有。

创建目标文件时,生成的目标文件不会写入标准输出,因此您的重定向不会导致 gcc 前端程序创建目标文件你想的名字。

例如:

arm-devkit-g++ -I. -c part1.cpp > build/target/part1.o

上述命令将在当前 目录中创建一个名为part1.o 的目标文件,并将(空)标准输出写入文件build/目标/part1.o。这将使 build/target/part1.o 为空,这是链接器所提示的(这就是它说文件被截断时的意思)。

命令应该看起来像

arm-devkit-g++ -I. -c part1.cpp -o build/target/part1.o

注意使用 -o 选项来命名输出文件。

您需要修改 makefile 以在构建目标文件时不使用重定向。


另外,构建目标文件时不应该列出头文件,只列出要构建的源文件,所以命令

arm-devkit-g++ -I. -c main.cpp part1.h part2.h > build/target/main.o

应该是

arm-devkit-g++ -I. -c main.cpp -o build/target/main.o

关于c++ - 生成文件-.o : file not recognized: File truncated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39438064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com