LNK2019 - 未解析的外部符号

时间:2014-09-13 15:52:08

标签: c++ unresolved-external

我试图通过查看旧的问题和答案找到解决这个问题的方法,但我无法发现我的情况有什么问题。我收到以下错误:

Error 66 error LNK2019: unresolved external symbol "public: static class PhysicsBody *
__cdecl PhysicsBody::createBox(float,float,enum PhysicsBodyType,float)"
(?createBox@PhysicsBody@@SAPAV1@MMW4PhysicsBodyType@@M@Z) referenced in function
"public: __thiscall Enemy::Enemy(void)" (??0Enemy@@QAE@XZ)

奇怪的是,代码文件在那里,包括.H和.CPP,它们都包含在解决方案中并正确编译。这是代码文件:

// Enemy.h
#pragma once

class Enemy {
public:
    Enemy();
private:
    PhysicsBody* m_body;
};

// Enemy.cpp
#include "Enemy.h"
#include "PhysicsBody.h"

Enemy::Enemy() {
    m_body = PhysicsBody::createBox(1.f, 1.f, PhysicsBodyType::Dynamic);
}

// PhysicsBody.h
#pragma once

enum PhysicsBodyType {
    Static, Dynamic, Kinematic
};

class PhysicsBody {
public:
    static PhysicsBody* createBox(float width, float height, PhysicsBodyType type, float mass = 1.f);
private:
    PhysicsBody();
};

// PhysicsBody.cpp
#include "PhysicsBody.h"

PhysicsBody::PhysicsBody() {

}

PhysicsBody* PhysicsBody::createBox(float width, float height, PhysicsBodyType type, float mass) {
    return new PhysicsBody();
}

(我在这里发现了一些不相关的代码。)

我已经在代码中浏览了几十次,并且无法发现任何错误。我的项目中有类似的代码,其他一切都有效。出于某种原因,这个PhysicsBody类会导致这些问题。我已经检查过它是否包含在项目/解决方案中,文件类型是C / C ++代码,它没有标记为内容,总体上它应该正常工作。

2 个答案:

答案 0 :(得分:1)

问题很可能是由于错误的VS项目文件引起的。我复制了PhysicsBody.h / .cpp文件的内容,删除了两个文件,创建了新文件并粘贴了原始内容。所有代码完全相同,现在可以正常工作,因此我得出结论,这是与VS相关的错误。

答案 1 :(得分:0)

问题代码中的错误

找不到的功能是:

PhysicsBody::createBox(float, float, enum PhysicsBodyType, float)

显示为定义的函数是:

PhysicsBody::createBox(float, float, enum PhysicsBodyType)

这两个函数之间有不同数量的参数。

出现的问题:

  1. 哪个是正确的定义?
  2. 如何使用错误的定义?
  3. 错误使用的声明在哪里?
  4. 您可能只需要重新编译所有内容。您可能需要查看PhysicsBody类的定义位置,因为它在两个位置定义。

    此问题现已解决。


    问题代码中没有重大错误

    使用修改后的问题中的代码(在#include "PhysicsBody.h"的开头添加Enemy.h,以便可以独立编译标头),并忽略有关{{1}的未使用参数的警告我可以使用GCC 4.9.1中的createBox和一个简单的g++来编译和链接代码:

    main()

    这告诉我,问题不在您显示的代码中,而是问题出现在您未显示的代码中。请研究如何创建MCVE(How to create a Minimal, Complete, and Verifiable Example?)或 SSCCE(Short, Self-Contained, Correct Example) - 两个相同基本想法的名称和链接。

    请准确发布重现问题的最小代码。 (我创建了一个新的子目录,将5个源文件 - 两个头文件,两个实现文件和一个普通的#include "Enemy.h" int main() { Enemy e; return 0; } - 放到目录中,然后从那里编译一个makefile。我建议你在Windows机器上做相同的操作。 )

    如果您确认上面发布的代码加上main()我显示的(1)编译和(2)无法链接,从而重现问题,那么表面上存在MSVC中的错误。我认为情况不太可能如此,但有趣的事情已经为人所知。

    为了记录,我正在使用GCC 4.9.1在Mac OS X 10.9.4 Mavericks上编译以及以下命令(显示警告消息):

    main.cpp