未定义的符号:vtable
Undefined symbol: vtable
所以这是这些编译器错误之一,我无法找出问题的根源。
这是类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
一起使用。
你在实现getQuality
时忘记了类范围:
double Conductance::getQuality(std::unordered_set<node>& C, Graph& G)
{
.....
}
您需要在实现文件中添加类范围:
double Conductance::getQuality(std::unordered_set<node>& C, Graph& G) {...
否则,链接器无法找到标头中定义的方法的实现。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 未定义的符号缺少 vtable
- 关于vtable符号可能未定义,因为类缺少其键函数
- 来自 vtable 的未定义符号是否意味着接口和实现之间存在错误
- EMF文件(.so)调试,符号找不到VTable错误
- 未定义的符号:vtable
- 体系结构x86_64 vtable的未定义符号