2009-02-01 52 views
0

我有一个头文件在库(alibrary.lib)。该库是一个静态库(.lib),它正确链接到exe。C++:头文件函数没有正确链接从库到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 &)" ([email protected]@[email protected]@[email protected]@Z) already defined in fly.obj 

任何想法?

感谢

回答

2

如果您定义了一个免费的(不是类的成员)函数,它必须在单独编译的.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); 

} 

的错误,因为你必须在头中的函数的定义造成的,但没有内嵌标记它。如果您现在将这个头文件包含到两个单独编译的文件中,那么链接程序在尝试链接编译后的目标文件时会抛出一个错误,因为它会看到两次定义的交叉函数。

它没有明确地将内联放入类的成员函数,因为在类定义中定义的成员函数是隐式内联的。然而,通常在头部制作函数定义并不是一个好主意。如果你的函数取决于其他类型,而不仅仅是向量(在你的情况下,它是很好的恕我直言,但它当然是有争议的 - 有些人不喜欢它),那么你将被要求包括这些类型的头。这将不必要地膨胀您的标题间接包含的代码。取而代之的是,在这些情况下,您将完全把只有你函数的声明头内:

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(); 
+0

内联工作。谢谢 – cbrulak 2009-02-01 05:35:02

1

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

头文件应该在其中声明,而不是定义。声明(syaing that something exists)就是类型定义,类声明,枚举等等。

定义(赋予存在的东西的意义)是类似于函数,变量定义等的东西。

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

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

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