c++ - v8a - x86 que significa
SÃmbolos indefinidos para arquitectura x86_64: Compilación de problemas (1)
No hay ningún misterio aquí, el vinculador le está diciendo que no ha definido los símbolos que faltan y que no lo ha hecho.
Similarity::Similarity()
o Similarity::~Similarity()
simplemente faltan y usted ha definido a los otros incorrectamente,
void Similarity::readData(Scanner& inStream){
}
no
void readData(Scanner& inStream){
}
etcétera etcétera.
La segunda es una función llamada readData, solo la primera es el método readData de la clase de similitud.
Para ser claro al respecto, en Similarity.h
void readData(Scanner& inStream);
pero en semejanza.cpp
void Similarity::readData(Scanner& inStream){
}
Así que estoy tratando de comenzar una tarea, mi profesor nos da Main.cpp, Main.h, Scanner.cpp, Scanner.h y algunas otras utilidades.
Mi trabajo es crear una clase de Similitud para comparar documentos usando los coeficientes de coseno y Jaccard. Sin embargo, parece que no puedo vincular el proyecto correctamente, por lo tanto, no puedo comenzar con el código real.
Después de intentar durante varias horas ver lo que estoy haciendo mal, necesito nuevos ojos para ver lo que estoy haciendo mal, sospecho que es obvio.
Aquí está el 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;
}
Y el 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
Mi Similarity.cpp
#include "Similarity.h"
using namespace std;
void readData(Scanner& inStream){
}
string maxCosine(){
return "cosine";
}
string maxJaccard(){
return "jaccard";
}
string toString(){
return "toString";
}
Y finalmente mi similitud.
#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
Cuando uso el archivo make que me proporcionó, y el que tengo que usar para que su script funcione, lo obtengo de este error:
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
Gracias por leer todo esto, cualquier sugerencia o solución sería muy apreciada.