2014-04-02 32 views
-3

因此,在这个项目中,我要开发一个二进制表达式树,并使用树后缀表达式转换成缀表达式。除了一个或两个我尚未完成的功能之外,所有东西都可以看起来很棒。但是在编译它时遇到错误。唯一的问题是,它并不真正告诉我问题是什么。当我尝试编译它时,出现以下问题:错误尝试编译二叉树程序时

g ++ -o bet.x bet.cpp /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../。 ./../lib64/crt1.o:在功能`_start ': (的.text + 0×20):未定义参考`主'

collect2:LD返回1个退出状态

化妆:** * [bet.x]错误1

我不知道这意味着什么。但是,这里是我的3个文件。

bet.x: bet.cpp 
    g++ -o bet.x bet.cpp 

clean: 
    rm -f *.o *.x core.* 

我的继承人bet.h(头文件)保存我的接口:我的makefile开始

#include <string> 

using namespace std; 

struct BinaryNode 
{ 
    string element; 
    BinaryNode* leftNode; 
    BinaryNode* rightNode; 
}; 

class BET 
{ 
public: 
    BET(); 
    BET(const string postfix); 
    BET(const BET&); 
    ~BET(); 
    bool buildFromPostfix(const string postfix); 
    const BET& operator= (const BET&); 
    void printInfixExpression(); 
    void printPostfixExpression(); 
    size_t size(); 
    size_t leaf_nodes(); 
    bool empty(); 


private: 

    void printInfixExpression(BinaryNode *n); 
    void makeEmpty(BinaryNode* &t); 
    BinaryNode* clone(BinaryNode* t) const; 
    BinaryNode* headNode; 
    void printPostfixExpression(BinaryNode *n); 
    size_t size(BinaryNode *t); 
    size_t leaf_nodes(BinaryNode *t); 

}; 

它可能会过多地告诉你我的整个bet.cpp文件有我所有的实现。但是这里有一些。如果需要更多的评论:

BET::BET() 
{ 
    headNode = NULL; 
} 

BET::BET(const string postfix) 
{ 
    headNode = NULL; 
    buildFromPostfix(postfix); 
} 

BET::BET(const BET& t) 
{ 
    headNode = clone(t.headNode); 
} 

BET::~BET() 
{ 
    makeEmpty(headNode); 
} 

//2 functions i made myself for high/low precedence 
bool isHighPrec(const string& op) 
{ 
    return op == "*" || op == "/"; 
} 

bool isLowPrec(const string& op) 
{ 
    return op == "+" || op == "-"; 
} 

//returns false for errors, returns true otherwise 
bool BET::buildFromPostfix(const string postfix){ 

    stack<BinaryNode*> opTree; 
    istringstream istr(postfix); 
    string op; 

    makeEmpty(headNode); 

    while(istr >> op) 
    { 
      if(isHighPrec(op) || isLowPrec(op)) 
      { 
        if(opTree.size() < 2) 
        { 
          cout << "Error -- invalid postfix expression!\n"; 
          while(opTree.size()) 
          { 
            makeEmpty(opTree.top()); 
            opTree.pop(); 
          } 
          return false; 
        } 
        else 
        { 
          BinaryNode* bn = new BinaryNode(); 

          bn->element = op; 
          bn->rightNode = opTree.top(); 
          opTree.pop(); 
          bn->leftNode = opTree.top(); 
          opTree.pop(); 

          opTree.push(bn); 
        } 
      } 
      else 
      { 
        BinaryNode* bn = new BinaryNode(); 

        bn->element = op; 
        bn->rightNode = NULL; 
        bn->leftNode = NULL; 

        opTree.push(bn); 
      } 
    } 

    if(opTree.size() != 1) 
    { 
      cout << "Error -- invalid postfix expression!\n"; 
      while(opTree.size()) 
      { 
        makeEmpty(opTree.top()); 
        opTree.pop(); 
      } 
      return false; 
    } 
    else 
    { 
      headNode = opTree.top(); 
      opTree.pop(); 
    } 
return true; 

} 
+0

你说_The唯一的事情是,它是不是真的告诉我什么问题is._但这是无效的。你粘贴的确切错误:'(.text + 0x20):undefined reference to'main'' – mah

+0

-1这可以很容易地通过简单的网页搜索来解决你的错误信息。 –

+0

可能重复[什么是未定义的引用/无法解析的外部符号错误,以及如何解决它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-符号错误和如何-DO-修复) –

回答

2

这意味着你正在尝试编译没有定义main功能的可执行程序。 该程序不知道哪个函数首先运行。

要解决这个问题,你需要添加int main(){ //body return 0; }某处在全球范围内的源代码。

+0

三江源。问题是我并不完全知道错误信息是什么,所以我试图搜索整个消息,并没有得到任何有用的结果。我想通了 –

+0

正确的目标。我搜索了很多答案,只有这个答案给了我解决方案。 'main()'函数丢失。 – Nav

0

以下命令:g++ -o bet.x bet.cpp说,让一个可执行文件,称为bet.x从单个文件:bet.cpp

然而,为了使您需要一个可执行main()函数丢失。

如果你只是想确保语法是好的,你可以建立一个目标文件通过传递-c到g ++

另一种方法是增加一个main()功能甚至写了一些测试来检查代码作品。