Проблема компиляции C ++; методы класса - PullRequest
10 голосов
/ 06 мая 2011

Я начал писать очень простой класс, и все виды методов класса, кажется, доставляют мне проблемы.Я надеюсь, что проблема во мне, а решение простое.

Команда 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;
};

Я использую g ++ в xcode, кстати.

Спасибо большое заранее,Я был над этой проблемой в течение нескольких часов.

РЕДАКТИРОВАТЬ:

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 ]

6 голосов
/ 06 мая 2011

Вы не компилируете код 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.

2 голосов
/ 06 мая 2011

Включите все файлы .cpp в командной строке, например:

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

Когда ваш проект расширяется, становится разумным управлять вашим проектом некоторым автоматическим способом: Makefiles, ant или каким-либо интегрированным в IDE файлом проекта.

1 голос
/ 06 мая 2011

Ну, g++ -o main main.cpp lexer.cpp может сделать свое дело. Однако я предлагаю сделать файлы makefile. При наличии нескольких файлов они пригодятся. Я бы также предложил добавить некоторую оптимизацию к вашей компиляции, например -O3 или -O2 (O - это буква o, а не ноль!). Разница в скорости исполнения очень заметна. Также, если вы хотите создавать библиотеки из ваших файлов, почему бы не использовать опцию --shared, которая создаст понравившуюся библиотеку. Я считаю создание общих библиотек очень полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...