代码之家  ›  专栏  ›  技术社区  ›  Dennis Vash

链接错误:多个定义[重复]

  •  0
  • Dennis Vash  · 技术社区  · 8 年前

    我正试图编译我的项目 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 , 但我不知道该改变什么。

    注释 :我成功地编译了 MinHeap.h

    我要编译的是 CmakeLists.txt文件 :

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

    水壶

    #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
    

    包括来自 绿洲

    #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"
    

    绿洲测验.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
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Vikash Kesarwani    8 年前

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

    推荐文章