2009-02-01 91 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); 

但在一個單獨的源文件中定義。