it-swarm.com.de

Undefinierte Symbole für die Architektur x86_64: Kompilierungsprobleme

Ich versuche also, eine Aufgabe zu starten. Mein Professor gibt uns ein Main.cpp, ein Main.h, ein Scanner.cpp, ein Scanner.h und einige andere Dienstprogramme.

Meine Aufgabe ist es, eine Ähnlichkeitsklasse zu erstellen, um Dokumente mit den Kosinus- und Jaccard-Koeffizienten zu vergleichen. Es scheint jedoch nicht möglich zu sein, das Projekt korrekt zu verknüpfen. Daher kann ich nicht mit dem eigentlichen Code beginnen.

Nachdem ich einige Stunden lang versucht habe zu sehen, was ich falsch mache, brauche ich frische Augen, um zu sehen, was ich falsch mache. Ich vermute, es ist offensichtlich.

Hier ist die Main.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;
}

Und der Main.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

Meine Similarity.cpp

#include "Similarity.h"

using namespace std;

void readData(Scanner& inStream){
}

string maxCosine(){
    return "cosine";
}

string maxJaccard(){
    return "jaccard";
}

string toString(){
    return "toString";
}

Und zum Schluss meine Similarity.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

Wenn ich das von ihm bereitgestellte Makefile verwende und das, das ich verwenden muss, damit sein Skript funktioniert, um es zu bewerten, erhalte ich den folgenden Fehler:

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

Vielen Dank für das Lesen, Anregungen oder Lösungen wäre sehr dankbar.

40
Trevor Hutto

Hier gibt es kein Rätsel, der Linker sagt Ihnen, dass Sie die fehlenden Symbole nicht definiert haben und dass Sie es nicht getan haben.

Similarity::Similarity() oder Similarity::~Similarity() fehlen nur und Sie haben die anderen falsch definiert,

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

nicht

void readData(Scanner& inStream){
}

usw. usw.

Die zweite Funktion heißt readData, nur die erste ist die readData-Methode der Similarity-Klasse.

Um dies zu verdeutlichen, in Similarity.h

void readData(Scanner& inStream);

aber in Similarity.cpp

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