C++ 链接器不会指出错误;多个定义警告指向同一行

C++ 链接器不会指出错误;多个定义警告指向同一行,c++,linker,multiple-definition-error,C++,Linker,Multiple Definition Error,相信我,我已经在这里浏览了好几篇文章,但是没有一篇提到我现在面临的问题。我有一个2年的程序,过去一直在运行。我正在恢复它,但由于某种原因,它现在不运行了 显然,我有多种定义(太多了): ========================================终端输出============================= build_files/LinkedStack.o: In function `LinkedStack': /home/owner/workspace/opencv-

相信我,我已经在这里浏览了好几篇文章,但是没有一篇提到我现在面临的问题。我有一个2年的程序,过去一直在运行。我正在恢复它,但由于某种原因,它现在不运行了

显然,我有多种定义(太多了):

========================================终端输出=============================

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses
。。。等等,等等。。。这一切都以:

collect2: ld returned 1 exit status
make: *** [executables/Assignment3.out] Error 1
========================================================================

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses
奇怪的是,链接器在大量的警告列表中没有指出任何错误,更不用说这些不是正确的多个定义了。请注意,“多个…-第一个定义的…”对中的每个警告都指向同一行。现在我不知道该怎么办

我想知道这是否与我们的makefile非常繁忙的语法有关(尽管我觉得它非常好):

=================================================生成文件=================================

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses

=========================================================================

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses
所以,我的问题是:1)为什么链接器会看到错误,2)为什么我有这么多的定义

如果你想澄清,请告诉我,即使你对发生的事情有点了解

========================================代码示例==============================

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses
下面是完整的示例函数(我不想让它太长):


==================================================================================

最有可能包括在多个翻译单元中实现非内联方法的标头。生成文件与它无关。您需要找到这些方法的定义,并查看它们最终如何包含到多个文件中。如果它们实际上在头文件中,最简单的修复方法可能是将它们全部内联

build_files/LinkedStack.o: In function `LinkedStack':
/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: multiple definition of `LinkedStack::LinkedStack()'
build_files/LinkedStack.o:/home/owner/workspace/opencv-galaxies/utilities/structures/LinkedStack.cpp:12: first defined here
CFLAGS = -g -Wno-deprecated

OBJECTS = utilities/basic/image.h build_files/image.o build_files/ReadImage.o build_files/ReadImageHeader.o build_files/WriteImage.o build_files/LinkedStack.o build_files/unsortedList.o build_files/region.o build_files/Main.o

executables/Assignment3.out: $(OBJECTS)
    g++ $(OBJECTS) -o executables/Assignment3.out build_files/*.o $(CFLAGS) -lncurses

编译器没有看到您将头包含到多个翻译单元中,因为它总是一次只处理一个。当链接器看到不同的对象文件时,它只会看到同一事物的许多定义并抱怨。不过,我原以为链接器指针指向定义的位置。

根据您提供的信息,甚至很难猜测问题出在哪里。但是,请确保 a) 在另一个cpp/h文件中不包含任何cpp文件。 b) 您在h文件中定义的任何实现都是内联的。
(我想b是你的问题)

缩小范围并发布精简版本的代码-给类留下1个方法。@LuchianGrigore:我应该对makefile也这样做吗?这些是错误,而不是警告(即使它没有说“错误:多定义…”)。现在,请想象你自己是另一个用户(像我一样),你不想看到一些实际的代码(C++代码)来提供帮助吗?(另请参阅)因为目前我们所能做的最好的事情是盲目猜测(例如,“您没有在头文件中包含.cpp文件,是吗?”)…@gx:对不起;我只是觉得我付出的就足够了。无论如何,这篇文章已经更新了。回答你们的问题,不;它是包含在.cpp文件中的头文件,即在.cpp文件中包含“LinkedStack.h”。@gx:我不认为这是瞎猜。我想这是事实,谢谢。我看到我的搭档做了一些不必要的愚蠢更改,比如将一个类的.h和.cpp都包含到另一个类的.h中。这可能是原因。为了让你的工作更轻松,你还建议我包括哪些内容?因为我在看,答案对我来说并不那么明显。你检查过我提到的两件事吗?正如我对迪特玛的答案所评论的那样,肯定有(a),不必要的包含,但没有(b),没有实现内联函数。。。然而,在你对迪特玛的回答中,你说你的搭档将一个班级的cpp包含在另一个班级的h文件中。除非我不理解你,否则这就是你的问题!cpp将在包含该h文件的每个翻译单元中编译,从而产生多个定义。