【问题标题】:Undefined symbol: vtable未定义符号:vtable
【发布时间】:2013-06-06 14:47:37
【问题描述】:

所以这是我无法找出问题根源的编译器错误之一。

这是类LocalQualityMeasure,标题

#include <unordered_set>

#include "../clustering/Clustering.h"
#include "../graph/Graph.h"

namespace Project {

/**
 * Abstract base class for all local clustering quality measures.
 */
class LocalQualityMeasure {


public:

    LocalQualityMeasure();

    virtual ~LocalQualityMeasure();

    virtual double getQuality(std::unordered_set<node>& C, Graph& G) = 0;
};

} /* namespace Project */

来源:

#include "LocalQualityMeasure.h"

namespace Project {

LocalQualityMeasure::LocalQualityMeasure() {
}

LocalQualityMeasure::~LocalQualityMeasure() {
    // TODO Auto-generated destructor stub
}


} /* namespace Project */

这是一个派生类Conductance,标题

#include <algorithm>

#include "LocalQualityMeasure.h"

namespace Project {

class Conductance: public Project::LocalQualityMeasure {
public:
    Conductance();
    virtual ~Conductance();

    virtual double getQuality(std::unordered_set<node>& C, Graph& G);
};

} /* namespace Project */

来源

#include "Conductance.h"

namespace Project {

Conductance::Conductance() : LocalQualityMeasure() {
}

Conductance::~Conductance() {
    // TODO Auto-generated destructor stub
}

double getQuality(std::unordered_set<node>& C, Graph& G) {

    double volume = 0;
    double boundary = 0;
    double all = 0;

    for (auto it = C.begin(); it != C.end(); ++it) {
        volume = volume + G.degree(*it);
        G.forNeighborsOf(*it, [&](node v){
            if (C.find(v) == C.end()) boundary++;
        });
    }

    G.forNodes([&](node v){
        all = all + G.degree(v);
    });

    if (volume == 0 || all-volume == 0)
        return 1;
    return boundary / std::min(volume, all-volume);
}

} /* namespace Project */

链接器抱怨缺少 vtable:

Undefined symbols for architecture x86_64:
  "Project::Conductance::getQuality(std::unordered_set<long long, std::hash<long long>, std::equal_to<long long>, std::allocator<long long> >&, Project::Graph&)", referenced from:
      vtable for Project::Conductance in Conductance.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Project-CommunityDetection-DPar] Error 1

我使用 GCC 4.7 和 --std=c++11

【问题讨论】:

  • IIRC 当一个类声明了一个虚函数但未实现时,我收到了那些带有 gcc 的误导性消息。而不是指出它说缺少 vtable 的功能。

标签: c++ gcc c++11 vtable


【解决方案1】:

您忘记了 getQuality 的实现中的类范围:

double Conductance::getQuality(std::unordered_set<node>& C, Graph& G) 
{
  .....
}

【讨论】:

  • 谢谢,只是没看到。
【解决方案2】:

您需要在实现文件中添加类范围:

double Conductance::getQuality(std::unordered_set<node>& C, Graph& G) {...

否则链接器无法找到头文件中定义的方法的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2012-08-14
    相关资源
    最近更新 更多