Как решить неопределенный символ для архитектуры x86_64

Я пытаюсь скомпилировать свой класс и получаю следующий результат.

g++ test.cpp -lconfig++ -stdlib=libstdc++
Undefined symbols for architecture x86_64:
  "CommandParser::parseCommand(std::string)", referenced from:
      _main in test-8f6e3f.o
  "CommandParser::CommandParser()", referenced from:
      _main in test-8f6e3f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Это класс, который я пытаюсь скомпилировать:

#include "commandparser.h"

using namespace libconfig;

CommandParser::CommandParser(string configFile){
  this->configFile = configFile;
}


CommandParser::CommandParser(){
  this->configFile = CONFIG_FILE_NAME;
}

string CommandParser::parseCommand(string cmd){
  Config cfg;

  try{
    cfg.readFile(this->configFile.c_str());
  }
  catch (const FileIOException &fi){
    cerr << "I/O error while reading file." << std::endl;
    exit(1);
  }
  catch (const ParseException &pe){
    cerr << "Parse error at " << pe.getFile() << ":" << pe.getLine()
              << " - " << pe.getError() << endl;
    exit(1);
  }

  try{
    string path = cfg.lookup(cmd);
    cout << "The path to the script is: " << path << endl;
    return path;
  }
  catch(const SettingNotFoundException &e){
    cerr << "No command with the name '"<<cmd<<"'"<<endl;
    exit(1);
  }
}

Как я могу исправить это и заставить код компилироваться? Я использую Mac OS X 10.9.


person Shookie    schedule 26.03.2014    source источник
comment
Вы объявили все это в своем .h, а затем включили .h в свой основной?   -  person Eric Amorde    schedule 26.03.2014


Ответы (1)


Я только предполагаю, и это предположение состоит в том, что показанный вами код не является частью файла test.cpp, а находится в отдельном файле. Это означает, что ваша команда сборки

$ g++ test.cpp -lconfig++ -stdlib=libstdc++

будет строить только test.cpp. Он не будет автоматически добавлять другие исходные файлы в процесс компиляции.

Вы должны явно строить с использованием всех соответствующих исходных файлов, например

$ g++ test.cpp commandparser.cpp -lconfig++ -stdlib=libstdc++
person Some programmer dude    schedule 26.03.2014
comment
Спасибо, что решил это! Я забыл добавить исходные файлы, как вы сказали. Вы случайно не знаете, как я могу заставить Eclipse также связать все соответствующие исходные файлы? Если я скомпилирую его вручную, он, похоже, сработает, но я все равно получаю ошибку в eclipse. - person Shookie; 26.03.2014
comment
@Shookie Когда-то я работал с Eclipse, но разве этого не должно быть достаточно, чтобы добавить файл в проект? - person Some programmer dude; 26.03.2014