【问题标题】:C++ compiling problem; class methodsC++编译问题;类方法
【发布时间】:2011-08-20 04:55:38
【问题描述】:

我已经开始写一个很简单的类了,各种类的方法似乎都给我带来了麻烦。我希望问题出在我身上,解决方法很简单。

命令 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 中使用 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

【问题讨论】:

  • +1 用于包含错误、您用于编译的命令和一个最小示例。一个很好的问题。
  • 我认为,您应该学习编写 Makefile 或使用 automake/autoconf 或 cmake 或 qmake 或使用可以为您做任何事情的 IDE。

标签: c++ class compiler-construction methods


【解决方案1】:

您没有编译 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.cpp 中定义的lexer.h 中声明的函数。

【讨论】:

  • 另外,当您在命令行中编译多个 .cpp 时,如您所示,是“编译”代码,然后将它们连接在一起,还是必须将 lexer.cpp 链接到 main .cpp 在 main.cpp 中使用#include "lexer.h"???
  • @hyperzap 它为您完成了这一切。您的原始错误是链接器错误 - 链接器找不到 Lexer::ConsoleWriteTokens() 尽管它拥有的所有代码都是正确的。当您添加 lexer.cpp 时,您会遇到额外的编译错误(因为某些代码是错误的)。当您修复了这些错误时,链接器又开始工作并且很高兴,因为它现在可以找到您的方法定义。
【解决方案2】:

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

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

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

【讨论】:

  • 您必须包含来自lexer.cpplexer.h。编译器会从每个源文件重新开始,每个源文件都必须包含它需要的头文件。
  • 非常感谢。有趣的是,我认为这是相反的方式,您使用#include将所有脚本“链接”在一起,而不是单独编译和链接。更不用说我在删除实验焦虑后忘记把#include放回去了。
【解决方案3】:

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

【讨论】:

  • +1 是的,您绝对应该使用脚本来帮助您构建文件。我会尝试从一开始就学习 cmake - 它是跨平台的,因此可以在 linux 和 windows 中使用。 autotools 只是一个(非常常见的)linux 工具。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多