编译时c ++未定义的符号

Luc*_*enK 4 c++ compiler-errors makefile undefined-symbol

修复:在头文件中有两次方法

尝试编译项目时出现以下错误

% make
g++ -o p4 testTree.o tree.o node.o check.o
Undefined                       first referenced
 symbol                             in file
Tree::inTree(int)                   tree.o
ld: fatal: Symbol referencing errors. No output written to p4
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `p4'
Run Code Online (Sandbox Code Playgroud)

Makefile文件

p4: testTree.o tree.o node.o check.o
    g++ -o p4 testTree.o tree.o node.o check.o
testTree.o: testTree.cc tree.h node.h check.h
    g++ -c -Wall -Werror testTree.cc

tree.o: tree.h tree.cc node.h check.h
    g++ -c -Wall -Werror tree.cc
node.o: node.h node.cc check.h
    g++ -c -Wall -Werror node.cc
check.o: check.h check.cc
    g++ -c -Wall -Werror check.cc
clean:
    rm -f *~ *.o p4
Run Code Online (Sandbox Code Playgroud)

来自tree.cc和tree.h的相关代码:

tree.cc

...
bool Tree::inTree(int k) const
{
     return locate(k,root) != NULL;
}
...
Run Code Online (Sandbox Code Playgroud)

tree.h中

#ifndef TREE_H
#define TREE_H

#include "node.h"
#include "check.h"
using namespace std;
class Tree
{
  private:
    Node *root;
  public:
    Tree();
    Tree(const Tree & t);
    const Tree & operator=(const Tree &t);
    friend ostream & operator<<(ostream &out, const Tree &t);
    bool inTree(int k) const;
    double & operator[](int k);
    double & operator[](int k) const;
    ~Tree();
    bool inTree(int index);
  private:
    Node * locate(int k, Node *rt) const;
    ostream & display(ostream &out, Node *r, int dir=Node::L) const;
    void add(int k, Node*&r);
    void kill(Node *&rt);
    void copy(Node *rt, Node *&newRt);
};
#endif
Run Code Online (Sandbox Code Playgroud)

我觉得它很简单,但我似乎无法弄明白.

And*_*owl 10

您获得的消息实际上来自链接器,而不是来自编译器.

您的一个成员函数,bool Tree::inTree(int index);被正确声明并定义为const成员函数:

 // Declaration in tree.h
 bool inTree(int index) const;

 // Definition in tree.cc
 bool Tree::inTree(int k) const
 //                       ^^^^^
Run Code Online (Sandbox Code Playgroud)

但是,在tree.h你也定义了这个非const重载inTree():

// Declaration in tree.h, definition (supposedly) nowhere
bool Tree::inTree(int k)
Run Code Online (Sandbox Code Playgroud)

对于那些没有提供的定义.这就是链接器抱怨的内容.


bas*_*h.d 6

这是你的错误:

bool Tree::inTree(int k) const
{
 return locate(k,root) != NULL;
}
Run Code Online (Sandbox Code Playgroud)

.h你的定义

bool inTree(int);
Run Code Online (Sandbox Code Playgroud)

这是一个区别!