未定义符号,适用于架构x86_64:编译问题

64

我正在尝试开始一个作业,我的教授给了我们Main.cpp、Main.h、Scanner.cpp、Scanner.h和其他一些实用程序。

我的工作是创建一个相似度类来使用余弦和Jaccard系数比较文档。然而,我似乎无法正确链接项目,因此我无法开始实际的代码。

经过几个小时的尝试,我需要新的眼睛来看看我做错了什么,我怀疑这很明显。

这是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;
}

还有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

我的Similarity.cpp

#include "Similarity.h"

using namespace std;

void readData(Scanner& inStream){
}

string maxCosine(){
    return "cosine";
}

string maxJaccard(){
    return "jaccard";
}

string toString(){
    return "toString";
}

最后是我的 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
当我使用他提供的makefile以及必须使用的makefile来运行他的脚本进行评分时,出现了以下错误:
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

感谢您阅读了所有内容,非常感谢您提出任何建议或解决方案。


2
尝试再次运行每个命令行时添加“-m32”。 - Kerrek SB
1
在 Similarity.cpp 中,您正在定义 maxJaccard,而不是 Similarity::maxJaccard。 - Marc Glisse
34
“-m32”是一个编译器选项,它指示编译器生成32位的目标代码。 - user391339
1个回答

72

这里没有什么神秘的地方,链接器告诉你缺少符号,并且你没有定义它们。

Similarity::Similarity()Similarity::~Similarity() 只是缺失了,而你定义的其他内容是不正确的。

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

不是

void readData(Scanner& inStream){
}

第二个函数名为readData,而只有第一个是Similarity类的readData方法。

明确一点,在Similarity.h文件中。

void readData(Scanner& inStream);

但是在Similarity.cpp中

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

当我这样做时,成员“相似度”会多出一个资格。有什么想法吗? - Trevor Hutto
你能引用准确的错误信息和相关代码吗? - john
从Similarity.cpp文件中包含: Similarity.h:12:错误:成员函数‘readData’上的额外限定符‘Similarity ::’是错误消息。 - Trevor Hutto
1
你把 Similarity::readData 放在了 .cpp 文件里而不是 .h 文件里。请查看答案的编辑。 - john
1
如果你在你的.cpp文件中写入string maxCosine() { ...,那么编译器不知道它与Similarity类有任何关系。你需要写成string Similarity::maxCosine() { ...来告诉编译器你正在谈论Similarity类中的maxCosine函数,而不是一些仅仅碰巧具有相同名称的随机函数。但是在.h文件中,string maxCosine();位于class Similarity { ... }内部,所以编译器知道你正在声明Similarity类的一个函数。 - john
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接