我已经开始编写一个非常简单的类,各种类方法似乎给我带来了问题。我希望问题出在我身上并且解决方案很简单。
命令 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
您没有编译 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
中定义的函数。
在命令行中包含所有 .cpp 文件,如下所示:
g++ -o main main.cpp lexer.cpp
当您的项目不断增长时,以某种自动方式管理您的项目变得明智:Makefile、ant 或某些 IDE 集成的项目文件。
好吧
g++ -o main main.cpp lexer.cpp
可以做到这一点。不过我建议制作 makefile 文件。当有多个文件时,它们会派上用场。
我还建议在编译中添加一些优化,例如 -O3 或 -O2 (O 是字母 o 而不是零数字!)。执行速度的差异非常明显。另外,如果您打算从文件中创建库,为什么不使用 --shared 选项来创建喜欢的库。我发现共享库非常有用。