C ++:header函数不被从库正确链接成exe
-
20-08-2019 - |
题
我在一个库(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);
但在一个单独的源文件中定义。