为什么编译器在我不使用库时给我错误 "undefined external symbol"?

Why compiler gives me error "undefined external symbol" when I don't use libraries?

我有: 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
... }; }

这是一个带有 class 的命名空间和一个声明的方法。 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 中定义,并使用在.h 中定义的宏PI 进行计算。 然后,我使用方法 Car::tranform() 计算物体在直线轨迹中的位置。它还在 .h 文件中声明为 Car class 的一部分,并在 .cpp 文件中定义。

此代码编译失败,出现 "Unresolved external symbol." 错误。 AFA 这是一个链接错误,我相信有些东西被宏或包含弄乱了。 我一直在拼命尝试在 Stack Overflow 上使用有关此错误的其他问题,但是大多数人在使用外部库时遇到此错误。

拜托,有人请提供建议,让我们检查两次以查看此代码的真正问题所在。

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

谢谢。

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

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

这是 .cpp 中的正确方法:

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

注意,当我们首先引用一个 class 然后定义它的方法时,它是 180 转的。

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