Undefined Symbols for architecture x86 64: Compiling problems

Więc próbuję rozpocząć zadanie, mój profesor daje nam główną.cpp, Main.H, Skaner.cpp, Skaner.h i kilka innych narzędzi.

Moim zadaniem jest stworzenie klasy podobieństwa do porównywania dokumentów przy użyciu współczynników cosinus i Jaccard. Jednak wydaje się, że nie mogę poprawnie połączyć projektu, dlatego nie jestem w stanie rozpocząć od rzeczywistego kodu.

Po kilku godzinach próbowania zobaczyć, co robię źle, potrzebuję świeżych oczu, aby zobaczyć, co robię źle, podejrzewam to to oczywiste.

Oto główna.cpp

#include "Main.h"

using namespace std;

static const string TAG = "Main: ";

int main(int argc, char *argv[])
{
  string inStreamName;
  string logStreamName;
  string outStreamName;

  ofstream outStream;
  string timeCallOutput;
  Scanner inStream;

  Similarity similarity;

  ///////////////////////////////////////////////////////////////
  // Boilerplate for naming files and opening files
  Utils::CheckArgs(3, argc, argv, "infilename outfilename logfilename");
  outStreamName = static_cast<string>(argv[2]);
  logStreamName = static_cast<string>(argv[3]);

  Utils::FileOpen(outStream, outStreamName);
  Utils::LogFileOpen(logStreamName);

  timeCallOutput = Utils::timecall("beginning");
  Utils::logStream << timeCallOutput << endl;
  Utils::logStream << TAG << "Beginning execution" << endl;

  Utils::logStream << TAG << "outfile '" << outStreamName << "'" << endl;
  Utils::logStream << TAG << "logfile '" << logStreamName << "'" << endl;
  Utils::logStream.flush();

  ///////////////////////////////////////////////////////////////
  // What follows here is the real work of this code.
  //   read the entire input file and echo it back
  //   compute the two similarity coefficients

  inStreamName = static_cast<string>(argv[1]);
  inStream.openFile(inStreamName);
  Utils::logStream << TAG << "infile '" << inStreamName << "'" << endl;
  Utils::logStream.flush();

  similarity.readData(inStream);

  outStream << TAG << "Data Begin\n" << similarity.toString() << endl;
  outStream << TAG << "Data End\n" << endl;
  outStream.flush();
  inStream.close();

  outStream << TAG << "Begin similarity computation" << endl;
  outStream << TAG << "Maximum Jaccard similarity:\n" <<
                       similarity.maxJaccard() << endl;
  outStream << TAG << "Maximum cosine similarity:\n" <<
                       similarity.maxCosine() << endl;
  outStream << TAG << "End similarity computation" << endl;
  outStream.flush();

  ///////////////////////////////////////////////////////////////
  // Boilerplate for terminating gracefully
  Utils::logStream << TAG << "Ending execution" << endl;
  timeCallOutput = Utils::timecall("ending");
  Utils::logStream << timeCallOutput << endl;
  Utils::logStream.flush();

  outStream.flush();
  Utils::FileClose(outStream);

  Utils::FileClose(Utils::logStream);

  return 0;
}

I główny.h

#ifndef MAIN_H
#define MAIN_H

#include "../../Utilities/Utils.h"
#include "../../Utilities/Scanner.h"

#include "Similarity.h"

class Main
{
public:
  int main();
  virtual ~Main();

private:

};

#endif // MAIN_H
Moje Podobieństwo.cpp
#include "Similarity.h"

using namespace std;

void readData(Scanner& inStream){
}

string maxCosine(){
    return "cosine";
}

string maxJaccard(){
    return "jaccard";
}

string toString(){
    return "toString";
}
I wreszcie Moje podobieństwo.h:
#ifndef SIMILARITY_H
#define SIMILARITY_H

#include "../../Utilities/Scanner.h"

class Similarity
{
public:
    Similarity();
    virtual ~Similarity();

    void readData(Scanner& inStream);
    string maxCosine();
    string maxJaccard();
    string toString();
private:

};

#endif

Kiedy korzystam z podanego przez niego pliku makefile i tego, którego muszę użyć, aby jego skrypt działał, aby go ocenić, dostaję ten błąd:

g++ -O3 -Wall -o Similarity.o -c Similarity.cpp
g++ -O3 -Wall -o Aprog Main.o Similarity.o Scanner.o ScanLine.o Utils.o 
Undefined symbols for architecture x86_64:
  "Similarity::maxJaccard()", referenced from:
      _main in Main.o
  "Similarity::readData(Scanner&)", referenced from:
      _main in Main.o
  "Similarity::toString()", referenced from:
      _main in Main.o
  "Similarity::maxCosine()", referenced from:
      _main in Main.o
  "Similarity::Similarity()", referenced from:
      _main in Main.o
  "Similarity::~Similarity()", referenced from:
      _main in Main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [Aprog] Error 1

Dziękuję za przeczytanie tego wszystkiego, wszelkie sugestie lub rozwiązania będą bardzo mile widziane.

Author: Trevor Hutto, 2013-09-12

1 answers

Nie ma tu żadnej tajemnicy, linker mówi ci, że nie zdefiniowałeś brakujących symboli i nie zdefiniowałeś.

Similarity::Similarity() lub Similarity::~Similarity() są po prostu brakuje i zdefiniowałeś inne nieprawidłowo,

void Similarity::readData(Scanner& inStream){
}

Nie

void readData(Scanner& inStream){
}

Itd. itd.

Druga to funkcja o nazwie readData, tylko pierwsza to metoda readData klasy podobieństwa.

Żeby było jasne, w podobieństwie.h

void readData(Scanner& inStream);

Ale w podobieństwie.cpp

void Similarity::readData(Scanner& inStream){
}
 43
Author: john,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-26 22:52:01