【问题标题】:Undefined Reference to未定义的引用
【发布时间】:2011-07-14 15:53:35
【问题描述】:

当我为链表编译代码时,我得到了一堆未定义的引用错误。代码如下。我一直在编译这两个语句:

g++ test.cpp 

还有

g++ LinearNode.h LinearNode.cpp LinkedList.h LinkedList.cpp test.cpp  

我真的不明白为什么会出现这些错误,因为我对 C++ 中的类真的很生疏。我真的需要一些帮助。

线性节点.h:

#ifndef LINEARNODE_H
#define LINEARNODE_H
#include<iostream>

using namespace std;

class LinearNode
{
    public:
        //Constructor for the LinearNode class that takes no arguments 
        LinearNode();
        //Constructor for the LinearNode class that takes the element as an argument
        LinearNode(int el);
        //returns the next node in the set.
        LinearNode* getNext();
        //returns the previous node in the set
        LinearNode* getPrevious();
        //sets the next element in the set
        void setNext(LinearNode* node);
        //sets the previous element in the set
        void setPrevious(LinearNode* node);
        //sets the element of the node
        void setElement(int el);
        //gets the element of the node
        int getElement();

    private: 
        LinearNode* next;
        LinearNode* previous;
        int element;        
};//ends the LinearNode class

#endif

线性节点.cpp:

#ifndef LINEARNODE_cpp
#define LINEARNODE_cpp
#include<iostream>
#include"LinearNode.h"

using namespace std;

//Constructor for LinearNode, sets next and element to initialized states
LinearNode::LinearNode()
{
    next = NULL;
    element = 0;
}//ends LinearNode default constructor

//Constructor for LinearNode takes an element as argument.
LinearNode::LinearNode(int el)
{
    next = NULL;
    previous = NULL;
    element = 0;
}//ends LinearNode constructor

//returns the next element in the structure
LinearNode* LinearNode::getNext()
{
    return next;
}//ends getNext function

//returns previous element in structure
LinearNode* LinearNode::getPrevious()
{
    return previous;
}//ends getPrevious function

//sets the next variable for the node
void LinearNode::setNext(LinearNode* node)
{
    next = node;
}//ends the setNext function

//sets previous for the node
void LinearNode::setPrevious(LinearNode* node)
{
    previous = node;
}//ends the setPrevious function

//returns element of the node
int LinearNode::getElement()
{
    return element;
}//ends the getelement function

//sets the element of the node
void LinearNode::setElement(int el)
{
    element = el;
}//ends the setElement function

#endif

LinkedList.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<iostream>
#include"LinearNode.h"

using namespace std;

class LinkedList
{
    public:
        LinkedList();
        void add(int element);
        int removie (int element);

    private:
        int count;
        LinearNode *contents;
};//ends the class linked list

#endif

LinkedList.cpp:

#ifndef LINKEDLIST_CPP
#define LINKEDLIST_CPP

#include<iostream>
#include"LinearNode.h"
#include"LinkedList.h"

using namespace std;

//linkedlist constructor for an empty linked list
LinkedList::LinkedList()
{
    count = 0;
    contents = NULL;
}//ends the constructor

//adds an element to the front of the linked list
void LinkedList::add(int element)
{
    int found = 0, current = 0;

    while( (found == 0) && (current !=count) )
    {
        if (contents.getElement() == element)
            found = 1;
        else    
        {
            contents = contents.getNext();
            current++;
        }//ends the else statement
    }//ends the while loop

    if (found == 0)
    {
        LinearNode node = new LinearNode(element);
        node.setNext(contents);
        contents.setPrevious(node);
        count++;
    }//ends the found == 0 if statment
}//ends the add function

//this function removes one element from the linked list.
int LinearNode::remove(int element)
{
    int found = 0;

    if (count == 0)
        cout << "The list is empty" << endl;
    else 
    {
        if (contents.getElement() == element)
        {
            result = contents.getElement();
            contents = contents.getNext();
        }//ends the contents.getElement() == element
        else 
        {
            previous = contents;
            current = contents.getNext();
            for (int index = 0; ( (index < count) && (found == 0) )index++)
                if (current.getElement() = element)
                    found = 1;
                else
                {
                    previous = current;
                    current = current.getNext();
                }//ends the else statement 

            if (found == 0)
                cout << "The element is not in the list" << endl;
            else
            {
                result = current.getElement();
                previous.setNext(current.getNext());
            }//ends else statement  

        }//ends the else stamtement

        count--;
    }//ends the else statement of count == 0
    return result;
}//ends the remove function

#endif

test.cpp:

#include<iostream>
#include"LinearNode.h"
#include"LinkedList.h"

using namespace std;

int main()
{

    LinearNode node1, node2, node3, move;
    LinkedList list;    

    node1.setElement(1);
    node2.setElement(2);
    node3.setElement(3);
}   

【问题讨论】:

  • 首先——不要把“.h”文件作为编译器的参数。它们已经包含在您的“.cpp”文件中。缺少哪些参考资料?您遇到的链接器错误是什么?
  • 另外,从不using namespace std;放入.h文件中。
  • 下次也粘贴错误信息。
  • 我在收到undefined reference to 错误时遇到了类似的问题,结果我忘记在.h 中包含带有代码的.cpp
  • @Avamander 那是错误的方式。您将头文件(即.h)包含在源文件(即.cpp)中,而不是相反。

标签: c++ undefined-reference


【解决方案1】:
  1. 通常标头保护用于头文件(即.h)而不是源文件(即.cpp)。
  2. 在源文件中包含必要的标准头文件和命名空间。

LinearNode.h:

#ifndef LINEARNODE_H
#define LINEARNODE_H

class LinearNode
{
    // .....
};

#endif

LinearNode.cpp:

#include "LinearNode.h"
#include <iostream>
using namespace std;
// And now the definitions

LinkedList.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

class LinearNode; // Forward Declaration
class LinkedList
{
    // ...
};

#endif

LinkedList.cpp

#include "LinearNode.h"
#include "LinkedList.h"
#include <iostream>
using namespace std;

// Definitions

test.cpp 是源文件就可以了。请注意,永远不会编译头文件。假设所有文件都在一个文件夹中 -

g++ LinearNode.cpp LinkedList.cpp test.cpp -o exe.out

【讨论】:

  • 现在包含保护可以只替换为文件开头的#pragma once
【解决方案2】:
g++ test.cpp LinearNode.cpp LinkedList.cpp -o test

【讨论】:

  • 这将解决生成Undefined Reference to 错误的链接器依赖项。但这只有在所有文件都在同一目录中时才有效。
【解决方案3】:

我收到此错误是因为我的 cpp 文件未添加到 CMakeLists.txt 文件中

【讨论】:

    【解决方案4】:

    获得此错误的另一种方法是不小心在匿名命名空间中编写了某些东西的定义:

    foo.h:

    namespace foo {
        void bar();
    }
    

    foo.cc:

    namespace foo {
        namespace {  // wrong
            void bar() { cout << "hello"; };
        }
    }
    

    其他.cc 文件:

    #include "foo.h"
    
    void baz() {
        foo::bar();
    }
    

    【讨论】:

      【解决方案5】:

      当我忘记将我创建的新 .h/.c 文件添加到介子配方中时,我遇到了这个问题,所以这只是一个友好的提醒。

      【讨论】:

        【解决方案6】:

        尝试删除构造函数和析构函数,它对我有用....

        【讨论】:

          猜你喜欢
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 2013-12-29
          • 2011-10-26
          • 2014-03-03
          • 2016-03-18
          • 2011-07-11
          相关资源
          最近更新 更多