背景: 期末实现B树,多文件编程。
CodeBlock上出现了如下报错
ld returned 1 exit status
这个报错以前遇到过,是因为之前运行的程序没有关闭,关闭后即可通过编译。
但是这里我并没有正在运行的程序窗口,所以并不是这个原因。
搜索引擎搜索,尝试了很多方法,无果。
编译器的信息量太少,无从debug,猜测是CodeBlock的问题,改用dev试一下。
dev上出现了如下报错
# Project: 项目1
# Makefile created by Dev-C++ 5.11
CPP = g++.exe -D__DEBUG__
CC = gcc.exe -D__DEBUG__
WINDRES = windres.exe
OBJ = B_tree.o main.o
LINKOBJ = B_tree.o main.o
LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -g3
INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include"
CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++"
BIN = 项目1.exe
CXXFLAGS = $(CXXINCS) -g3
CFLAGS = $(INCS) -g3
RM = rm.exe -f
.PHONY: all all-before all-after clean clean-custom
all: all-before $(BIN) all-after
clean: clean-custom
${RM} $(OBJ) $(BIN)
$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
B_tree.o: B_tree.cpp
$(CPP) -c B_tree.cpp -o B_tree.o $(CXXFLAGS)
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)
第二十五行标红,编译器提示
25 C:\Users\ASUS\Desktop\Makefile.win recipe for target '项目1.exe' failed
没见过的报错,搜索引擎搜索,看了很多文章,主要说了以下几种解决方法:
1、关闭杀毒软件……等等(我觉得没有什么关系)
2、任务管理器结束collect2.exe(我在任务管理器里面没看到)
3、其他一些属性上的设置(有的试了无果,有的不敢试)
后来看到一篇文章:IT之屋的某篇博文 ,链接如下:http://www.it1352.com/369267.html
情况相似,也是25行报错,但是他好好的看了一下编译器的信息(看的比我全),他说的编译器意思如下:
他的main函数重复定义了,
然后main第一次定义出现在哪个文件哪一行
然后就是后面两行上面提到的信息。
他的解决方法就是把重复的那个main删了
what???冷静了一下,看了看我自己的编译器
还真的就是这样,只不过不是函数,而是一个全局变量m在用多文件编译的时候重复定义了。
这时候看一下我的代码
main.cpp
…………
#include "b_tree.h"
int main()
{
…………
B_tree.h
#ifndef B_TREE_H_INCLUDED
#define B_TREE_H_INCLUDED
#define KeyType int
…………
int m = 3;//全局变量m, 指m阶B树
typedef struct BTNode
{
…………
B_tree.cpp
#include "head.h"
bool Creat_btree(BTree &T)//创建一个空的B树
{
…………
修改一下
main.cpp
int m = 3;//全局变量m, 指m阶B树
B_tree.h
extern int m;
B_tree.cpp不用修改
BUG解决,正常运行。
查到的那篇博文是mian函数写重复了,而我是一个变量重复了,那你有可能是其他东西重复了,或者其他不是因为重复而编译失败的bug,所以遇到recipe for target '项目1.exe' failed
,看看上面有说到什么,解决方案就是:实事求是,因地制宜,就事论事。
吐槽一句,CodeBlock的编译器真菜,那么一句提示信息量太少,debug无从下手,dev都做的比它好。
反思
1、犯了糊涂,因为自己多文件编译不熟而写出来的bug,还debug了两个小时。
2、没有认真去看编译器的提示。自己选择性失明了,编译器四条信息我就盯着后面两条在搜,真糊涂。
3、太依赖搜索引擎,一个劲查,没想着自己解决。
4、被编译器小小的坑了一下