未定义参考

时间:2010-12-16 20:50:53

标签: c++


编译我的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,assign和normalize。

我使用“g ++ -c”编译文件来创建.o文件,因为eclipse没有找到它们。但错误仍然存​​在。

有没有人知道这个问题的解决方案?

请注意,Vector3.cpp和Ray.cpp文件只显示与此问题相关的代码。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

在Vector3.cpp中,从函数中删除inline修饰符,或将函数定义移到Vector3.h。

C ++编译器不能跨模块内联函数。您无法在一个模块中定义内联函数并从另一个模块中调用它。

修改的: 从 C ++编程语言,第199页:“内联函数必须在相同的定义中定义 - 在每个使用它的翻译单元中。”第200页:“为了确保一致性,通常只应在头文件中放置全局包含和内联。”

答案 1 :(得分:1)

这个问题的格式看起来有点奇怪,如果你已经检查了这些东西,请原谅我。你有没有:

  1. 在ray.h文件中包含了vector3.h? (或者更好的是,向前声明了vector3类并在ray.cpp中包含了头文件 - 从而最大限度地减少了编译时的依赖性。)
  2. 在vector3类定义周围使用了一个包含保护?
  3. 确保您没有在项目中使用另一个库,该库也声明了一个名为Vector3的类?这就是命名空间的用途 - 你应该使用它们。
  4. 我建议不要手动编译目标文件。如果您的IDE找不到文件,那么有一些更基本的错误 - 您检查了项目设置吗?具体来说,包含路径中的vector3.h文件夹是?

    自动完成工具通常与编译器分开,因此自动完成工作可能根本不相关。