ld返回了1个退出状态w/函数的多个定义

ld returned 1 exit status w/ multiple definition of function

本文关键字:函数 定义 返回 1个 退出 状态 ld      更新时间:2023-10-16

可能有一个2秒的解决方案,但我在过去的一个小时里一直在努力解决这个问题,这让我抓狂。

我正试图将.cpp和.h文件链接到一个main.cpp文件中,以便在那里运行。但我在cpp文件中得到了每个函数的多重定义,这导致了"ld返回1退出状态"

我添加的函数越多,得到的错误就越多。

这是我的代码:

binaryHeap.h:

#ifndef Binary_H
#define Binary_H
#include <vector>
class BinaryHeap{
    private:
        std::vector <int> heap;
        int left(int parent);
        int right(int parent);
        void heapifyUp(int index);
        void heapifyDown(int index);
    public:
        BinaryHeap(); //Constructor
        void insert(int element); //inserts element into heap
        void deleteMin(); // deletes minimum element
        int extractMin();
        void displayHeap();
        int size();
};
#endif //Binary_H

binaryHeap.cpp:

#include <iostream>
#include "binaryHeap.h"
BinaryHeap::BinaryHeap(){
}
void BinaryHeap::heapifyUp(int index){
    int parent = (index - 1) / 2;
    if(index != 0 && parent >= 0 && heap[parent] > heap[index]){
        int temp = heap[index];
        heap[index] = heap[parent];
        heap[parent] = temp;
        heapifyUp(parent);
    }
}

void BinaryHeap::insert(int element){
    heap.push_back(element);
    heapifyUp(heap.size() - 1);
}

void BinaryHeap::displayHeap(){
    std::vector<int>::iterator pos = heap.begin();
    while (pos != heap.end()){
        std::cout << *pos << std::endl;
        pos++;
    }
}

main.cpp:

#include "binaryHeap.cpp"
int main(int argc, char* argv[]) {
    BinaryHeap h;
    h.insert(5);
    h.insert(2);
    h.insert(19);
    return 0;
}

错误如下:

main.o:main.cpp:(.text+0x0):的多重定义BinaryHeap::BinaryHeap()' binaryHeap.o:binaryHeap.cpp:(.text+0x0): first defined here main.o:main.cpp:(.text+0x0): multiple definition of BinaryHeap::BinaryHeap()'BinaryHeap.o:BinaryHeap.cpp:(.text+0x0):此处首次定义main.o:main.cpp:(.text+0x20):多重定义的BinaryHeap::heapifyUp(int)' binaryHeap.o:binaryHeap.cpp:(.text+0x20): first defined here main.o:main.cpp:(.text+0xfe): multiple definition of BinaryHeap::insert(int)'BinaryHeap.o:BinaryHeap.cpp:(.text+0xfe):此处首次定义main.o:main.cpp:(.text+0x13e):多重定义的BinaryHeap::displayHeap()' binaryHeap.o:binaryHeap.cpp:(.text+0x13e): first defined here c:/program files (x86)/dev-cpp/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld.exe: binaryHeap.o: bad reloc address 0x0 in section.pdatea$_ZnwyPv'collect2.exe:错误:ld返回1退出状态

C: \Users\~\Deskt\编码训练\二进制堆\Makefile.win:25:recipe目标"Binary"失败的mingw32-make.exe:***["Binary]错误1

根据我的评论,您决不能在任何其他文件中包含.cpp文件。#include所做的是将包含文件中的所有内容复制到包含它的位置。这意味着binaryHeap.cpp的内容在代码中被编译两次。这就是错误告诉你的。

要解决案例中的错误-在main.cpp中,将include更改为binaryHeap.h

编辑:添加更多解释:

include指令只是将文件源复制并粘贴到该位置。因此,如果将binaryHeap.cpp包含在main.cpp中,则binabyHeap的源实际上被编译了两次。而且,一旦链接器开始组合对象文件,它就会获取binaryHeap.cpp中的多个定义,并引发一些错误。