Compilation Error: Undefined Archtiecture
Compilation Error: Undefined Archtiecture
我正在尝试编写一个简单的程序来了解 C++ 中的二叉树遍历。但是,当我尝试使用 make
编译我的程序时,出现以下错误:
Undefined symbols for architecture x86_64:
"Node::postOrderTraversalNode(Node*)", referenced from:
BinaryTree::postOrderTraversal(BinaryTree*) in BinaryTree.o
postOrderTraversalNode(Node*) in Node.o
ld: symbol(s) not found for architecture x86_64
我查看了其他 StackExchange 帖子并将其缩小到与我如何设置 makefile
有关的内容,但我似乎仍然找不到错误。任何帮助将不胜感激。
生成文件:
BinaryTree_Program: Main.o BinaryTree.o Node.o
clang++ BinaryTree.o Node.o Main.o -o BinaryTree_Program
Main.o: Main.cpp
clang++ -c Main.cpp -o Main.o
BinaryTree.o: BinaryTree.h BinaryTree.cpp
clang++ -c BinaryTree.cpp -o BinaryTree.o
Node.o: Node.h Node.cpp
clang++ -c Node.cpp -o Node.o
clean:
rm BinaryTree_Program Main.o BinaryTree.o Node.o
Main.cpp
#include "BinaryTree.h"
#include "Node.h"
int main() {
Node* root = new Node(10);
Node* nd1 = new Node(5);
Node* nd2 = new Node(3);
Node* nd3 = new Node(2);
Node* nd4 = new Node(15);
Node* nd5 = new Node(12);
Node* nd6 = new Node(20);
root->left = nd1;
root->right = nd4;
nd1->left = nd2;
nd1->right = nd3;
nd4->left = nd5;
nd4->right = nd6;
// 10
// / \
// 5 15
// / \ / \
// 3 2 12 20
BinaryTree* tree = new BinaryTree(root);
BinaryTree::inOrderTraversal(tree);
}
BinaryTree.cpp
#include "BinaryTree.h"
#include "Node.h"
// The in, pre, and post is based on where we visit the root
BinaryTree::BinaryTree(Node* nd) {
root = nd;
}
// The in, pre, and post is based on where we visit the root
void BinaryTree::inOrderTraversal(BinaryTree* t) {
if (t != NULL){
Node::inOrderTraversalNode(t->root);
}
}
void BinaryTree::preOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::preOrderTraversalNode(t->root);
}
}
void BinaryTree::postOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::postOrderTraversalNode(t->root);
}
}
Node.cpp
#include "Node.h"
Node::Node(int d) {
data = d;
left = NULL;
right = NULL;
}
void Node::visitNode(Node* nd) {
std::cout << nd -> data << " " << std::endl;
}
void Node::inOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::inOrderTraversalNode(nd -> left);
Node::visitNode(nd);
Node::inOrderTraversalNode(nd -> right);
}
}
void Node::preOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::visitNode(nd);
Node::preOrderTraversalNode(nd -> left);
Node::preOrderTraversalNode(nd -> right);
}
}
void postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
Node.h
#ifndef NODE_H
#define NODE_H
#include <iostream>
class Node {
public:
// member data
int data;
Node* left;
Node* right;
// constructor
Node(int d);
// member functions
static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
//static void levelOrderTralversalNode(Node* n);
static void visitNode(Node*);
};
#endif
BinaryTree.h
#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include "Node.h"
using namespace std;
class BinaryTree {
public:
// member data
Node* root;
// constructor
BinaryTree(Node* n);
// member functions
static void inOrderTraversal(BinaryTree* t);
static void preOrderTraversal(BinaryTree* t);
static void postOrderTraversal(BinaryTree* t);
//void levelOrderTraveral(BinaryTree* t);
};
#endif
Node.h 声明了以下函数:
static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
static void visitNode(Node*);
Node.cpp 包含 Node::inOrderTraversalNode 和 Node::preOrderTraversalNode 的声明以及这个自由函数:
void postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
但不包含 Node::postOrderTraversalNode
的声明
很明显,自由函数 postOrderTraversalNode 是一个成员函数,因此它应该像其他函数一样声明为 class 成员:
void Node::postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
我正在尝试编写一个简单的程序来了解 C++ 中的二叉树遍历。但是,当我尝试使用 make
编译我的程序时,出现以下错误:
Undefined symbols for architecture x86_64:
"Node::postOrderTraversalNode(Node*)", referenced from:
BinaryTree::postOrderTraversal(BinaryTree*) in BinaryTree.o
postOrderTraversalNode(Node*) in Node.o
ld: symbol(s) not found for architecture x86_64
我查看了其他 StackExchange 帖子并将其缩小到与我如何设置 makefile
有关的内容,但我似乎仍然找不到错误。任何帮助将不胜感激。
生成文件:
BinaryTree_Program: Main.o BinaryTree.o Node.o
clang++ BinaryTree.o Node.o Main.o -o BinaryTree_Program
Main.o: Main.cpp
clang++ -c Main.cpp -o Main.o
BinaryTree.o: BinaryTree.h BinaryTree.cpp
clang++ -c BinaryTree.cpp -o BinaryTree.o
Node.o: Node.h Node.cpp
clang++ -c Node.cpp -o Node.o
clean:
rm BinaryTree_Program Main.o BinaryTree.o Node.o
Main.cpp
#include "BinaryTree.h"
#include "Node.h"
int main() {
Node* root = new Node(10);
Node* nd1 = new Node(5);
Node* nd2 = new Node(3);
Node* nd3 = new Node(2);
Node* nd4 = new Node(15);
Node* nd5 = new Node(12);
Node* nd6 = new Node(20);
root->left = nd1;
root->right = nd4;
nd1->left = nd2;
nd1->right = nd3;
nd4->left = nd5;
nd4->right = nd6;
// 10
// / \
// 5 15
// / \ / \
// 3 2 12 20
BinaryTree* tree = new BinaryTree(root);
BinaryTree::inOrderTraversal(tree);
}
BinaryTree.cpp
#include "BinaryTree.h"
#include "Node.h"
// The in, pre, and post is based on where we visit the root
BinaryTree::BinaryTree(Node* nd) {
root = nd;
}
// The in, pre, and post is based on where we visit the root
void BinaryTree::inOrderTraversal(BinaryTree* t) {
if (t != NULL){
Node::inOrderTraversalNode(t->root);
}
}
void BinaryTree::preOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::preOrderTraversalNode(t->root);
}
}
void BinaryTree::postOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::postOrderTraversalNode(t->root);
}
}
Node.cpp
#include "Node.h"
Node::Node(int d) {
data = d;
left = NULL;
right = NULL;
}
void Node::visitNode(Node* nd) {
std::cout << nd -> data << " " << std::endl;
}
void Node::inOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::inOrderTraversalNode(nd -> left);
Node::visitNode(nd);
Node::inOrderTraversalNode(nd -> right);
}
}
void Node::preOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::visitNode(nd);
Node::preOrderTraversalNode(nd -> left);
Node::preOrderTraversalNode(nd -> right);
}
}
void postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
Node.h
#ifndef NODE_H
#define NODE_H
#include <iostream>
class Node {
public:
// member data
int data;
Node* left;
Node* right;
// constructor
Node(int d);
// member functions
static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
//static void levelOrderTralversalNode(Node* n);
static void visitNode(Node*);
};
#endif
BinaryTree.h
#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include "Node.h"
using namespace std;
class BinaryTree {
public:
// member data
Node* root;
// constructor
BinaryTree(Node* n);
// member functions
static void inOrderTraversal(BinaryTree* t);
static void preOrderTraversal(BinaryTree* t);
static void postOrderTraversal(BinaryTree* t);
//void levelOrderTraveral(BinaryTree* t);
};
#endif
Node.h 声明了以下函数:
static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
static void visitNode(Node*);
Node.cpp 包含 Node::inOrderTraversalNode 和 Node::preOrderTraversalNode 的声明以及这个自由函数:
void postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
但不包含 Node::postOrderTraversalNode
的声明很明显,自由函数 postOrderTraversalNode 是一个成员函数,因此它应该像其他函数一样声明为 class 成员:
void Node::postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}