2011-05-06 109 views
10

我已经开始编写一个非常简单的类,而且各种类的方法似乎给我带来了问题。我希望问题是我,解决方法很简单。C++编译问题; class methods

命令克++ -o主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 ++。

Thankyou非常提前,我已经在这个问题上了几个小时。

编辑:

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

就不能工作。 -Hyperzap

+2

+1包含错误,您用于编译的命令和一个最小示例。一个非常好的问题。 – Tom 2011-05-06 13:35:33

+1

我想你应该学会编写Makefiles或者使用automake/autoconf或者cmake或者qmake或者使用一个IDE来为你做任何事情。 – 2011-05-06 13:54:56

回答

6

您没有编译lexer.cpp代码。

尝试

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

为您编译命令。

问题IN THE lexer.cpp

你可能想包括在lexer.cpp文件中的词法头

#include "lexer.h" 

而且,你不要想从虚空返回一个整数功能。

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; 
}; 

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

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中声明的函数的注释。

+0

不,不起作用。 – 2011-05-06 13:39:35

+0

nvm,现在有效。谢谢。 – 2011-05-06 13:44:44

+0

另外,当你在命令行中编译多个.cpp文件时,是在编译代码,然后将它们连接在一起,还是必须使用#include“lexer将lexer.cpp链接到main.cpp .h“在main.cpp中? – 2011-05-07 02:42:24

2

包括在命令行中的所有.cpp文件,就像这样:

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

当你的项目的发展,它变得聪明一些自动化的方式来管理你的项目:Makefile文件,蚂蚁,或一些人们的首选综合项目文件。

+0

仍然不起作用。我收到了一百万个错误。 – 2011-05-06 13:34:04

+1

您必须在'lexer.cpp'中包含'lexer.h'。编译器将重新开始每个源文件,每个源文件都必须包含它所需的头文件。 – Lindydancer 2011-05-06 13:40:22

+0

优秀的谢谢。有趣的是,我认为这是另一种方式,你使用#include将所有脚本“链接”在一起,而不是单独编译和链接。更何况我忘了把实验中的#include放回去之后的焦虑。 – 2011-05-06 13:42:35

1

那么g++ -o main main.cpp lexer.cpp应该做的伎俩。不过,我建议makefile文件。当有多个文件时,他们就派上用场了。 我也建议在你的编译中添加一些优化,如-O3或-O2(O是一个不是零的字母!)。执行速度的差异非常明显。此外,如果你是goig使你的文件的图书馆,为什么不使用 - 共享选项,将创建一个喜欢的库。我发现让共享库非常有用。

+0

+1是的,你应该明确地使用脚本来帮助你建立你的文件。我会尝试从一开始就学习cmake - 它的跨平台,因此可以在linux和windows上工作。 autotools只是一个(非常常见的)linux工具。 – Tom 2011-05-06 15:25:39