链接错误:多个定义 [英] Linking Error: Multiple definitions

查看:68
本文介绍了链接错误:多个定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编译我的项目,并得到函数错误的多个定义:

I'm trying to compile my project and getting multiple definition of function error:

CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::left(int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:56: multiple definition of `MinHeap::MinHeap(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:56: first defined here

似乎我的头文件中有变量定义,应该删除或将其定义为 extern ,或将其定义为 inline ,但我不知道该更改什么.

It seems that I have variable definitions in my header file, and those should be removed or made extern, or made inline, but I don't have an idea what to change.

注意:我成功地在没有 MinHeap.h

我要在 CMakeLists.txt 中进行编译的内容:

What I'm trying to compile as in CMakeLists.txt:

add_executable(OasisTest
        Oasis.cpp
        Tests/Oasis_test.cpp
        )

MinHeap.h

#ifndef OASIS_MINHEAP_H
#define OASIS_MINHEAP_H

#include <iostream>
#include <climits>

using namespace std;

// Prototype of a utility function to swap two integers
void swap(int* x, int* y);

// A class for Min Heap
class MinHeap {

    int* harr; // pointer to array of elements in heap
    int capacity; // maximum possible size of min heap
    int heap_size; // Current number of elements in min heap
public:
    // Constructor
    MinHeap(int cap);

    // to heapify a subtree with the root at given index
    void MinHeapify(int);

    int parent(int i) { return (i - 1) / 2; }

    // to get index of left child of node at index i
    int left(int i) { return (2 * i + 1); }

    // to get index of right child of node at index i
    int right(int i) { return (2 * i + 2); }

    // to extract the root which is the minimum element
    int extractMin();

    // Decreases key value of key at index i to new_val
    void decreaseKey(int i, int new_val);

    // Returns the minimum key (key at root) from min heap
    int getMin() { return harr[0]; }

    // Deletes a key stored at index i
    void deleteKey(int i);

    // Inserts a new key 'k'
    void insert(int k);

    bool isEmpty();
};

// Constructor: Builds a heap from a given array a[] of given size
MinHeap::MinHeap(int cap) {
    heap_size = 0;
    capacity = cap;
    harr = new int[cap];
}

// Inserts a new key 'k'
void MinHeap::insert(int k) {
    if (heap_size == capacity) {
        cout << "\nOverflow: Could not insert\n";
        return;
    }

    // First insert the new key at the end
    heap_size++;
    int i = heap_size - 1;
    harr[i] = k;

    // Fix the min heap property if it is violated
    while (i != 0 && harr[parent(i)] > harr[i]) {
        swap(&harr[i], &harr[parent(i)]);
        i = parent(i);
    }
}

// Decreases value of key at index 'i' to new_val.  It is assumed that
// new_val is smaller than harr[i].
void MinHeap::decreaseKey(int i, int new_val) {
    harr[i] = new_val;
    while (i != 0 && harr[parent(i)] > harr[i]) {
        swap(&harr[i], &harr[parent(i)]);
        i = parent(i);
    }
}

// Method to remove minimum element (or root) from min heap
int MinHeap::extractMin() {
    if (heap_size <= 0)
        return INT_MAX;
    if (heap_size == 1) {
        heap_size--;
        return harr[0];
    }

    // Store the minimum value, and remove it from heap
    int root = harr[0];
    harr[0] = harr[heap_size - 1];
    heap_size--;
    MinHeapify(0);

    return root;
}

// This function deletes key at index i. It first reduced value to minus
// infinite, then calls extractMin()
void MinHeap::deleteKey(int i) {
    decreaseKey(i, INT_MIN);
    extractMin();
}

// A recursive method to heapify a subtree with the root at given index
// This method assumes that the subtrees are already heapified
void MinHeap::MinHeapify(int i) {
    int l = left(i);
    int r = right(i);
    int smallest = i;
    if (l < heap_size && harr[l] < harr[i])
        smallest = l;
    if (r < heap_size && harr[r] < harr[smallest])
        smallest = r;
    if (smallest != i) {
        swap(&harr[i], &harr[smallest]);
        MinHeapify(smallest);
    }
}

bool MinHeap::isEmpty() {
    return heap_size <= 0;
}

// A utility function to swap two elements
void swap(int* x, int* y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

#endif //OASIS_MINHEAP_H

包括 Oasis.h

#include "library2.h" //Only typedefs
#include "DataStructures/HashTable.h" //Includes AVLTree.h
#include "DataStructures/AVLRankTree.h" //Include to AvlExceptions 
#include "DataStructures/MinHeap.h" 

Oasis.cpp

#include "Oasis.h"

Oasis_test.cpp

#include "TestMacros.h"
#include "../Oasis.h"

完整错误:

CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::left(int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:56: multiple definition of `MinHeap::MinHeap(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:56: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::left(int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:56: multiple definition of `MinHeap::MinHeap(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:56: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `HashTable<int>::destroy_hash()':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:63: multiple definition of `MinHeap::insert(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:63: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `swap(int*, int*)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:137: multiple definition of `swap(int*, int*)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:137: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::decreaseKey(int, int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:83: multiple definition of `MinHeap::decreaseKey(int, int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:83: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::extractMin()':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:92: multiple definition of `MinHeap::extractMin()'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:92: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::MinHeapify(int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:118: multiple definition of `MinHeap::MinHeapify(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:118: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::deleteKey(int)':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:111: multiple definition of `MinHeap::deleteKey(int)'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:111: first defined here
CMakeFiles/OasisTest.dir/Tests/Oasis_test.cpp.o: In function `MinHeap::isEmpty()':
/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/Tests/../DataStructures/MinHeap.h:132: multiple definition of `MinHeap::isEmpty()'
CMakeFiles/OasisTest.dir/Oasis.cpp.o:/home/d_/CODING/CLionProjects/DS1-Course_Wet2/Oasis-2/DataStructures/MinHeap.h:132: first defined here

推荐答案

您正在定义头文件本身中的每个成员;因此,每当您在源代码中包含头文件时,都会重新定义这些成员;这就是为什么您会收到多个定义错误的原因.要解决此问题,请在类本身中定义每个成员函数,或者将定义从头文件移动到单独的cpp文件(就像其他人建议的一样),然后将该cpp文件添加到 add_executable 命令中.

You are defining each member in the header file itself; so each time you include the header file in your source code, these members are redefined; that is why you are getting multiple definition error. To resolve this either define each member function in the class itself or move the definitions from header file to a separate cpp file(like other people suggested) and add that cpp file to add_executable command.

这篇关于链接错误:多个定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆