0

所以我正在尝试构建一个小型 3D 引擎作为 VC++ 8.0 的练习。我有一个 MathLib 静态库和一个由我的 TestBed exe 链接的 Render 静态库。现在 Render 有两个类:Color 和 DXManager3D。颜色包括我来自 MathLib 的 Vector.h 很好,没有问题。

第二次我尝试在 DXManager3D 中包含 Vector.h,它让我大吃一惊,说符号被定义了两次,第二个定义被忽略(来自 lib 的警告)。我认为可能包括它两次会导致此问题,因此作为测试,我从 Color.h 中删除了 Vector.h 并将其留在 DXManager3D.h 中 - 同样的问题。我进行了三次检查,以确保我将所有东西都包裹在 ifndef 中以防止这种情况发生,所以我只能摸不着头脑。

DXManager3D.obj : 警告 LNK4006: "public: __thiscall Math::Vector::Vector(void)" (??0Vector@Math@@QAE@XZ) 已在 Render.obj 中定义;第二个定义被忽略

真正让我困惑的是,当我将 Render.lib 与 TestBed 分开构建时,它不应该链接任何东西,因为它是一个静态库,对吧?我仍然收到多个符号定义警告。如果我在 main 中实例化 DXManager3D,我的警告就会变成错误。

Render.lib(DXManager3D.obj) : error LNK2005: "public: __thiscall Math::Vector::Vector(void)" (??0Vector@Math@@QAE@XZ) 已经在 WinMain.obj 中定义

是的,我有 F1 的 LNK4006 和 LNK2005,而 MSDN 中的解决方案对我不起作用。抱歉,如果之前有人问过这个问题,我找不到任何可靠的东西来帮助我使用搜索功能。

谢谢!

4

2 回答 2

2

您的Vectorctor 是否在类定义之外的标题中定义?使其内联,然后改变

class Vector {
  public:
    Vector();
  // ...
}; 

Vector::Vector() {
   // ...
}

class Vector {
  public:
  Vector() {}
  // ...
}; 

或使用明确的inline限定:

class Vector {
   public:
  Vector();
  // ...
}; 

inline Vector::Vector() {
   // ...
}
于 2009-04-04T19:19:39.827 回答
1

看起来您的矢量类存在链接问题。根据您的信息,该类似乎被链接到任何包含头文件的库中。这是内部链接,您确实需要外部链接。

你能发布 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。

于 2009-04-04T19:17:27.820 回答