C ++编译问题;类方法

时间:2011-05-06 13:25:45

标签: c++ class compiler-construction methods

我已经开始编写一个非常简单的类了,各种类方法似乎都给我带来了问题。我希望问题在于我,解决方案很简单。

命令g ++ -o main main.cpp给出了以下输出:

/usr/bin/ld: Undefined symbols:
Lexer::ConsoleWriteTokens()
collect2: ld returned 1 exit status

main.cpp中:

#include<iostream>
#include"lexer.h"


int main(){

   Lexer lexhnd = Lexer();
    std::cout << "RAWR\n";
    lexhnd.ConsoleWriteTokens();
   std::cout << "\n\n";

return 0;
 }

lexer.h:

#ifndef __SCRIPTLEXER
#define __SCRIPTLEXER

#include <iostream>
#include <string>
#include <vector>

#define DEF_TOKEN_KEYWORD 0

struct token{
 int flag;
 std::string data;
};

class Lexer
{
public:
//  bool IsTrue();
//  bool AddLine(char * line);
    void ConsoleWriteTokens(void);

private:
std::vector<token> TOK_list;

};


#endif

lexer.cpp:

bool Lexer::IsTrue(){
return true;
};


 bool Lexer::AddLine(char * line){

token cool;
cool.data = line;

TOK_list.push_back(cool);
string = line;
return true;
};

void Lexer::ConsoleWriteTokens(void){

for (int i = 0; i < TOK_list.size(); i++){
    std::cout << "TOKEN! " << i;
}

return 0;
};

我在xcode btw中使用g ++。

非常感谢,我已经解决了这个问题几个小时了。

编辑:

g++ -o main lexer.h main.cpp
or
g++ -o main lexer.cpp main.cpp
or
g++ -o main main.cpp lexer.cpp

也不起作用。 -Hyperzap

3 个答案:

答案 0 :(得分:6)

您没有编译lexer.cpp代码。

尝试

g++ -o main main.cpp lexer.cpp

作为编译命令。

lexer.cpp中的问题

您可能希望在lexer.cpp文件中包含词法分析器标头

#include "lexer.h"

此外,您不希望从void函数返回一个整数。

void Lexer::ConsoleWriteTokens(void){
  for (int i = 0; i < TOK_list.size(); i++){
    std::cout << "TOKEN! " << i;
  }
  //This function is void - it shouldn't return something
  //return 0;
};

最后,你对这个功能有一些问题

bool Lexer::AddLine(char * line){

  token cool;
  cool.data = line;

  TOK_list.push_back(cool);
  //what is this next line trying to achieve?  
  //string = line;
  return true;
};

我不确定你用我评论过的那条线想要实现什么, 它似乎没有做任何事情,字符串没有定义(你的意思是std::string mystring = line;

最后,不要忘记取消注释您在lexer.h中定义的lexer.cpp中声明的函数。

答案 1 :(得分:2)

在命令行中包含所有.cpp文件,如下所示:

g++ -o main main.cpp lexer.cpp

当您的项目增长时,以自动方式管理项目变得明智:Makefile,ant或一些IDE集成的项目文件。

答案 2 :(得分:1)

g++ -o main main.cpp lexer.cpp可以做到这一点。但是我建议制作makefile文件。当拥有多个文件时,它们会派上用场。 我还建议在编译中添加一些优化,如-O3或-O2(O是字母o不是零数字!)。执行速度的差异非常明显。此外,如果您要从文件中创建库,为什么不使用--shared选项来创建一个喜欢的库。我发现使共享库非常有用。