【发布时间】:2014-11-07 14:45:25
【问题描述】:
我试图通过查看旧的问题和答案来找到解决此问题的方法,但我无法发现我的情况有什么问题。我收到以下错误:
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++ 代码,它没有标记为内容,总体上它应该可以工作。
【问题讨论】:
-
您在 Windows 上吗?你建立一个DLL? Enemy 和 PhysicsBody 是否在同一个模块中? (DLL 或 exe)?
-
我在 Windows 上,没有构建 DLL,并且两者都在同一个项目中。 PhysicsBody 类中大约有 20 个方法,其中三个都给出了错误,上面代码中显示的只是一个示例。
-
好的。我看到你在此期间解决了你的问题。在 Windows 上,我经常用来解决此类问题的工具是 Dependency walker dependencywalker.com。通常通过使用它,您会发现该类没有从它所在的 thr Dll 中导出(因此链接器理所当然地抱怨),或者导出函数的“损坏”名称与错误消息中的名称不同(这可能是由于链接到一个过时的 DLL 导出库)。这就是我问你是否在 Windows 上的原因。