ld返回1退出状态w /多功能定义

时间:2015-04-06 07:17:39

标签: c++ heap ld

这可能有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。pdata $ _ZnwyPv'   collect2.exe:错误:ld返回1退出状态

     

C:\ Users \〜\ Desktop \ Coding Training \ Binary Heap \ Makefile.win:25: recipe   目标'“二进制”失败mingw32-make.exe:*** [“二进制]错误1

1 个答案:

答案 0 :(得分:2)

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

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

编辑:添加更多解释:

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