架构 x86_64 的未定义符号:编译问题

Posted

技术标签:

【中文标题】架构 x86_64 的未定义符号:编译问题【英文标题】:Undefined Symbols for architecture x86_64: Compiling problems 【发布时间】:2013-09-16 02:35:35 【问题描述】:

所以我正在尝试开始一项作业,我的教授给了我们一个 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

我的相似度.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 时,我必须使用这个文件才能让他的脚本对其进行评分,我收到此错误:

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

感谢您阅读所有内容,任何建议或解决方案将不胜感激。

【问题讨论】:

再试一次,将-m32 添加到每个命令行。 在 Similarity.cpp 中,您定义的是 maxJaccard,而不是 Similarity::maxJaccard。 -m32 有什么作用? 【参考方案1】:

这里没有什么秘密,链接器告诉你你没有定义缺失的符号,而你没有。

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)

【讨论】:

当我这样做时,我获得了成员“相似性”的额外资格。有什么想法吗? 您能否引用确切的错误消息及其引用的代码? 在来自 Similarity.cpp:1 的文件中:Similarity.h:12: error: extraqualification 'Similarity::' on member 'readData' 是错误消息。 您将Similarity::readData 放在 .cpp 文件中,而不是放在 .h 文件中。请参阅对答案的编辑。 如果您在 .cpp 文件中写入 string maxCosine() ...,那么编译器将不知道这与 Similarity 类有任何关系。您说string Similarity::maxCosine() ... 是为了告诉编译器您正在谈论的是 Similarity 类中的 maxCosine 函数,而不是一些恰好具有相同名称的随机函数。但在 .h 文件中,string maxCosine();class Similarity ... 内部,因此编译器知道您正在声明 Similarity 类的函数。

以上是关于架构 x86_64 的未定义符号:编译问题的主要内容,如果未能解决你的问题,请参考以下文章

架构 x86_64 / i386 的未定义符号

编译时 x86_64 的未定义符号

架构 x86_64 的未定义符号:MqtUtil

MATLAB:mex-compile 上缺少框架 – 架构 x86_64 的未定义符号

架构 x86_64 的未定义符号:El Capitan [重复]

Qt 5.2 Mac 10.10.1 架构 x86_64 的未定义符号