静态Lib多重定义链接错误

时间:2009-04-04 19:12:47

标签: c++ linker-errors

所以我试图在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中的解决方案对我不起作用。 很抱歉,如果以前曾询问过此问题,我找不到任何可靠的信息来帮助我使用搜索功能。

谢谢!

2 个答案:

答案 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()构造函数吗?这应该可以为我们提供实际情况的线索。

链接:http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr020.htm

修改

根据您的评论,您似乎已在类库外部声明了头文件中的所有函数。您应该将它们放入非头文件(例如Vector.cpp文件)。

这将为您的程序提供适当的链接,您将能够在两个程序中包含Vector.h。