2010-12-16 110 views
0


我有麻煩編譯我的C++項目,因爲我得到一個未定義的參考錯誤。
我有2類:未定義的參考

Vector3.h

class Vector3 
{ 
public: 
float x, y, z; 
float v[3]; 
Vector3(); 
Vector3(float x, float y, float z); 
float mag(); 
void normalize(); 
void invert(); 
void assign(float x, float y, float z); 
Vector3& operator += (const Vector3& in); 
Vector3& operator -= (const Vector3& in); 
Vector3& operator *= (const float& in); 
Vector3& operator /= (const float& in); 
Vector3 operator -(); 
static const Vector3 vZero; 
}; 

Vector3.cpp

#include "Vector3.h" 

inline void Vector3::assign(float inx, float iny, float inz) 
{ 
x = inx; 
y = iny; 
z = inz; 
} 

inline float Vector3::mag() 
{ 
return (float)sqrt((*this) * (*this)); 
} 

inline void Vector3::normalize() 
{ 
float invMag = 1.f/mag();  
(*this) *= invMag; 
} 

Ray.h

#include "Vector3.h" 

class Ray 
{ 

public: 
Vector3 origin; 
Vector3 direction; 
Vector3 destination; 
float distance; 

Ray(); 
Ray(Vector3 o, Vector3 d); 
void setOrigin(float x, float y, float z); 
void setOrigin(const Vector3& v); 
void findDirection(void); 
void setDestination(float x, float y, float z); 
void setDestination(const Vector3& v); 
void findDestination(void); 
void setDirection(const Vector3& v); 
void normalizeDirection(void); 
}; 

Ray.cpp

#include "Ray.h" 

void Ray::findDirection(void) 
{ 
direction = destination - origin; 
distance = direction.mag(); 
direction.normalize(); 
} 

當我編譯使用Eclipse IDE我得到它:

/Ray.cpp:39: undefined reference to `Vector3::mag()' 
/Ray.cpp:40: undefined reference to `Vector3::assign(float, float, float)' 
/Ray.cpp:41: undefined reference to `Vector3::normalize()' 

文件包含的頭和自動完成工具的工作原理確定,它顯示(識別)的方法:MAG,分配和規範。

我使用「g ++ -c」編譯文件來創建.o文件,因爲eclipse沒有找到它們。但錯誤仍然存​​在。

有沒有人知道這個問題的解決方案?

請注意文件Vector3.cpp和Ray.cpp只顯示與此問題相關的代碼。

感謝您的幫助!

+0

顯示您的編譯命令。 – robert 2010-12-16 20:53:02

+0

如果eclipse沒有編譯它們,那麼它可能不會鏈接它們。檢查您的項目設置以確保路徑正確。 – stonemetal 2010-12-16 20:57:46

+0

嘗試在ray.cpp中包含directry vector3.h,它工作嗎? – Delashmate 2010-12-16 20:59:57

回答

1

這個問題的格式看起來有點奇怪,所以請原諒我,如果你已經檢查過這些東西。你有:

  1. 包含在ray.h文件中的vector3.h? (或者更好的是,向前聲明vector3類,並將頭文件包含在ray.cpp中 - 從而最大限度地減少編譯時依賴性)。
  2. 在vector3類定義的周圍使用了一個include防護嗎?
  3. 確定您沒有在項目中使用另一個庫,該庫還聲明瞭一個名爲Vector3的類?這是命名空間的用途 - 您應該使用它們。

我建議不要手動編譯目標文件。如果你的IDE找不到這些文件,那麼有一些更基本的錯誤 - 你檢查了你的項目設置嗎?具體來說,包含路徑中的vector3.h文件夾是什麼?

自動完成工具通常與編譯器分開,因此自動完成工作可能根本就不相關。

4

在Vector3.cpp中,從函數中刪除inline修飾符,或者將函數定義移動到Vector3.h。

C++編譯器不能跨模塊內聯函數。您無法在一個模塊中定義內聯函數並從另一個模塊中調用它。

編輯: 從的C++編程語言,PG 199:「內聯函數必須被定義 - 由相同的定義 - 在每一個轉換單元在其中使用它的」第200頁:「爲確保一致性,您通常應將全局常量和內聯放置在頭文件中。」

+0

內聯函數不是靜態的,其餘都是正確的,標準要求在每個使用它們的編譯單元中定義它們。 – 2010-12-16 21:09:37

+0

太棒了!這樣可行!謝謝! – user493861 2010-12-16 21:20:42

+0

基因 - 感謝您的更正:-) – leedm777 2010-12-16 21:23:27