所以我试图在VC ++ 8.0上构建一个小型3D引擎作为练习。我有一个MathLib静态库和一个由我的TestBed exe链接的Render静态库。现在Render有两个类:Color和DXManager3D。颜色包括我在MathLib中的Vector.h就好了,没问题。
第二次我尝试在DXManager3D中包含Vector.h,它会炸毁我,说符号定义了两次,第二个定义被忽略(来自lib的警告)。我想可能包括它两次造成这个因此作为测试我从Color.h中删除了Vector.h并将其留在DXManager3D.h中 - 同样的问题。我已经进行了三次检查以确保我将所有内容都包含在ifndef中以防止这种情况发生,所以我不得不挠头。
DXManager3D.obj:警告LNK4006:已在Render.obj中定义的“public:__ thiscall Math :: Vector :: Vector(void)”(?? 0Vector @ Math @@ QAE @ XZ);忽略第二个定义
让我感到困惑的是,当我构建与TestBed分开的Render.lib时,它不应该链接任何东西,因为它是一个静态库,对吧?我仍然得到多个符号定义警告。如果我在main中实例化DXManager3D,我的警告就会变成错误。
Render.lib(DXManager3D.obj):错误LNK2005:已在WinMain.obj中定义的“public:__ thiscall Math :: Vector :: Vector(void)”(?? 0Vector @ Math @@ QAE @ XZ)
是的,我已经推出了LNK4006和LNK2005,而且MSDN中的解决方案对我不起作用。 很抱歉,如果以前曾询问过此问题,我找不到任何可靠的信息来帮助我使用搜索功能。
谢谢!
答案 0 :(得分:2)
您的Vector
ctor是否在类定义之外的标题中定义了?然后将其设为内联即更改
class Vector {
public:
Vector();
// ...
};
Vector::Vector() {
// ...
}
到
class Vector {
public:
Vector() {}
// ...
};
或使用明确的inline
资格:
class Vector {
public:
Vector();
// ...
};
inline Vector::Vector() {
// ...
}
答案 1 :(得分:1)
看起来你的矢量类存在链接问题。根据您的信息,似乎该类被链接到包含头文件的任何lib。这是内部联系,你真的想要外部联系。
你可以发布Vector.h的内容,或至少发布Vector()构造函数吗?这应该可以为我们提供实际情况的线索。
修改强>
根据您的评论,您似乎已在类库外部声明了头文件中的所有函数。您应该将它们放入非头文件(例如Vector.cpp文件)。
这将为您的程序提供适当的链接,您将能够在两个程序中包含Vector.h。