当我不使用库时,为什么编译器会给我错误“未定义的外部符号”?

时间:2016-11-05 11:29:02

标签: c++ macros forward-declaration predefined-macro

我有: frw_trafic.h:

#define PI 3.14159265

namespace FRW
{
float angleToProperRadians(float angle);

class Car 
     {
public:
...
void transform(int time = 1);
...
private:
...
float velocDir; // angle in degrees, same as Sector angle
float wheelDir; // hence delta angle between car velocity direction and where wheels drive direction
float centerPosX;
float centerPosY; //these two are for car position
... }; }

这是一个带有类和声明方法的命名空间。 frw_traffic.cpp

#ifndef FRWTRAFFIC
#define FRWTRAFFIC
#include "frw_traffic.h"
#endif

#include <cmath>

using namespace FRW;

 float angleToProperRadians(float angle)
 {
for (; angle < -360 || angle > 360;)
{
    if (angle < -360)
    {
        angle = angle + 360;
        continue;
    }
    if (angle > 360)
    {
        angle = angle - 360;
    }
}

if (angle < 0)
{
    angle = 360 - angle;
}

return angle * PI / 180;
}
void Car::transform(int time) {
if (wheelDir == 0)
{
    centerPosX = centerPosX + static_cast<float>(time) * speed * cos(FRW::angleToProperRadians(velocDir)) ;
    centerPosY = centerPosY + static_cast<float>(time) * speed * sin(FRW::angleToProperRadians(velocDir)) ;
} }

方法angleToProperRadians()在.h中声明,在.cpp中定义,用于计算宏PI,在.h中定义。 然后,我用方法Car :: tranform()计算线轨迹中的对象位置。它也在.h文件中声明为Car类的一部分,并在.cpp文件中定义。

此代码无法编译,提供“未解析的外部符号”。错误。 AFA这是一个链接错误,我相信有些东西搞砸了宏或包含。 我一直在拼命试图在Stack Overflow上使用关于此错误的其他问题,但是大多数人在使用外部库时遇到了这个错误。

请某人提供一些建议,告诉他们要检查两次该代码的真正错误。

错误LNK2019:未解析的外部符号“float __cdecl FRW :: angleToProperRadians(float)”(?angleToProperRadians @ FRW @@ YAMM @ Z)在函数“public:void __thiscall FRW :: Car :: transform(int)”中引用(?转换@ Car @ FRW @@ QAEXH @ Z)

谢谢。

1 个答案:

答案 0 :(得分:0)

实际上,在这种特殊情况下,宏无处可归。 链接是错误的,因为在.h中声明并在.cpp文件中定义的angleToProperRadians()方法是完全独立的函数。

实际上,.h中的一个现在位于FRW命名空间中。 事实上,.cpp中的一个现在是另一个新的全局函数。 并且&#34;使用名称空间FRW;&#34;实际上并没有帮助这种情况,因为它可用于引用已经定义的方法。

这是.cpp中的正确方法:

...
float FRW::angleToProperRadians(float angle)
{
for (...) {
...

注意,当我们第一次引用一个类然后定义它的方法时它是如何180转。

那就是它。感谢Yves Daoust在评论中指出这一点。