我在一个库(alibrary.lib)的头文件。图书馆是一个静态库(.LIB),并适当地链接到exe文件。

现在,我有一个类:的Vector3D

class Vector3d 
{
    void amethod()
    {
       blah
    }

};

Vector3d cross(const Vector3d &v0, const Vector3d &v1) 
{
      float x,y,z;

      x = v0.y*v1.z-v0.z*v1.y;
      y = v0.z*v1.x-v0.x*v1.z;
      z = v0.x*v1.y-v0.y*v1.x;

     return Vector3d(x,y,z);

}

的Vector3D被声明和在头文件(的Vector3D .h)中所定义。之后类的声明,我的交叉功能。

在LIB编译是文件,但是,当其链接到该单元测试的exe我得到这个错误:

 flywindow.obj :error LNK2005: "class Vector3d __cdecl cross(class Vector3d const &,class Vector3d const &)" (?cross@@YA?AVVector3d@@ABV1@0@Z) already defined in fly.obj

任何想法?

由于

有帮助吗?

解决方案

如果定义函数的自由(一类的不是成员),它具有在一个cpp文件中定义单独编译,或在头部和内联标记。所以你的情况,你可以逃脱使得这个编译:

inline Vector3d cross(const Vector3d &v0, const Vector3d &v1) {
      float x,y,z;

      x = v0.y*v1.z-v0.z*v1.y;
      y = v0.z*v1.x-v0.x*v1.z;
      z = v0.x*v1.y-v0.y*v1.x;

     return Vector3d(x,y,z);

}

的误差造成的,因为你必须在头中的函数的定义,但不是内联标记它。如果你现在包括头成分别编译两个文件,链接,试图编译对象文件链接时,会抛出一个错误,因为它然后看见被定义两次交叉功能。

它的工作原理而不exlicitly把内嵌一类的成员函数,因为被在类定义内定义成员函数隐式联。

然而

有,不是一般的好主意,使函数定义在首部。如果您的功能将取决于其他类型的不仅仅是向量(在你的情况下,它的罚款恕我直言,但它是值得商榷的,当然 - 有些人不喜欢它),那么你将需要包括这些类型的标头。这将不必要的臃肿多数民众赞成间接的头包含的代码。取而代之的是,在这些情况下,你会仅仅只放声明你的函数的水箱内:

Vector3d cross(const Vector3d &v0, const Vector3d &v1);

但是,这单独编译的cpp文件内定义。内联,当然,应该然后被丢弃。


让我补充的定义和说明,一个小名单,只是为了在保持事情说清楚什么声明和定义装置函数和类帮助。需要注意的是每一个定义也是一个声明,而不是周围的其他方式:

// class _declaration_ of boo
class boo;

// class _definition_ of foo.
class foo {
    // member function _declaration_ of bar
    void bar();

    // member function _definition_ of baz
    void baz() { }
};

// function _definition_ of fuzz
inline void fuzz() { }

// function _declaration_ of fezz
void fezz();

其他提示

最有可能的解释是,你有代码(交叉明确的定义)在您的包含文件和您的包括被列入由两个源文件的文件,因此双定义。

头文件应该具有在它们的声明,而不是定义。声明(syaing的东西存在的话)是一样的东西的typedef的,类声明,枚举的等等。

解释(给出的含义存在茨艾伦东西)的东西等的功能,varialble定义等。

您交叉函数应该在头文件中声明:

Vector3d cross(const Vector3d &v0, const Vector3d &v1);

但在一个单独的源文件中定义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top