2010-12-16 111 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