我试图通过查看旧的问题和答案找到解决这个问题的方法,但我无法发现我的情况有什么问题。我收到以下错误:
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 ++代码,它没有标记为内容,总体上它应该正常工作。
答案 0 :(得分:1)
问题很可能是由于错误的VS项目文件引起的。我复制了PhysicsBody.h / .cpp文件的内容,删除了两个文件,创建了新文件并粘贴了原始内容。所有代码完全相同,现在可以正常工作,因此我得出结论,这是与VS相关的错误。
答案 1 :(得分:0)
找不到的功能是:
PhysicsBody::createBox(float, float, enum PhysicsBodyType, float)
显示为定义的函数是:
PhysicsBody::createBox(float, float, enum PhysicsBodyType)
这两个函数之间有不同数量的参数。
出现的问题:
您可能只需要重新编译所有内容。您可能需要查看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