连接错误c ++未解析的外部符号

时间:2010-10-03 11:14:36

标签: c++ linkage

我正在编写一个Matrix程序:我有一个表示一个Regular矩阵(RegMatrix)的类,以及一个表示稀疏矩阵(SparseMatrix)的类,即:仅表示非零值。

在每个H文件的开头,我写了相反的类声明。例如,在SparseMatrix.h中我编写了类RegMatrix(这样编译器就会识别我对这个类的引用)。在每个cpp文件中,我都包含两个H文件。

我的程序编译,但我有很多连锁错误,说“未解析的外部符号..”

例如: 未解析的外部符号“public:int__thiscall RegMatrix :: getCol(void)const”(?getCol @ RegMatrix @@ QBEHXZ)“[file:SparseMatrix.obj]

我很想弄清楚我的代码出了什么问题..

2 个答案:

答案 0 :(得分:0)

基本上,这意味着程序中的某些东西正在使用RegMatrix类中的getCol,但是你的编译不包括这种例程的正文。

要寻找的东西:

  • 您是否真的创建了该例程的实现?使用完全相同的参数配置文件?
  • 您是否忘记将编译该例程的源文件添加到要编译并链接到您的程序的源文件列表中? (在VisualStudio中,您是否将其添加到项目中?)
  • 当您在RegMatrix::文件中编码时,您是否意外地将.cpp从常规名称的前面移开了?

答案 1 :(得分:0)

这与头文件的相互包含无关,尽管这不是一个好的设计。你忘了或错误地输入了这个定义(忘了一些const限定符或类似的东西)。关于“不太好的设计”声明:你显然交错了两个类,因此它们不能独立使用。如何在不与RegMatrix交错的情况下为SparseMatrix编写单元测试,反之亦然?我建议使两个定义完全相互独立,并添加一个知道两种矩阵类型的矩阵类型转换器实现。如果您决定添加其他矩阵类型,请考虑这些问题:您必须修改指数数量的文件,才能添加转换。大多数简化设计看起来像:

regmatrix.h:

class RegMatrix {
 // stuff, no mention of SparseMatrix
};

sparsematrix.h:

class SparseMatrix {
 // stuff, no mention of RegMatrix
};

conversions.cpp :(带有conversions.h中的声明)

#include "sparsematrix.h"
#include "regmatrix.h"
#include "uppertriangular.h" // got it?
//...

namespace Conversions {
 void SparseToRegular(SparseMatrix& pTo, const RegMatrix& pFrom) { .. }
 void RegularToSparse(RegMatrix& pTo, const SparseMatrix& pFrom) { .. }
}