2011-05-06 156 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