LNK2019-未解析的外部符号

LNK2019 - Unresolved external symbol

本文关键字:外部 符号 LNK2019-      更新时间:2023-10-16

我试图通过查看旧的问题和答案来找到这个问题的解决方案,但我找不到我的问题出了什么问题。我得到以下错误:

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++代码,它没有标记为内容,总体上应该可以工作。

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

问题代码中的错误

找不到的函数是:

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

如定义所示的功能是:

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

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

出现的问题:

  1. 哪个是正确的定义
  2. 这个错误的定义是如何被使用的
  3. 错误使用的声明在哪里

您可能需要简单地重新编译所有内容。您可能需要查看PhysicsBody类的定义位置,因为它是在两个地方定义的。

此问题现已在问题中解决


问题中的代码中没有重大错误

使用修正问题中的代码(在Enemy.h的开头添加#include "PhysicsBody.h",以便可以独立编译标头),并忽略有关未使用参数的警告到createBox函数,我可以使用GCC 4.9.1中的g++和一个微不足道的main():编译并链接代码

#include "Enemy.h"
int main()
{
    Enemy e;
    return 0;
}

这向我表明,问题不在于你显示的代码,而在于你没有显示的代码。请学习如何创建MCVE(如何创建最小、完整和可验证的示例?)或SSCCE(简短、自包含、正确的示例)——同一基本思想的两个名称和链接。

请准确地发布再现该问题的最小代码。(我创建了一个新的子目录,将5个源文件——两个头文件、两个实现文件和一个微不足道的main()——放入目录中,并从中编译一个makefile。我建议您在Windows机器上执行等效操作。)

如果你确认上面发布的代码加上我展示的main.cpp确实(1)编译了,(2)链接失败,从而再现了问题,那么MSVC中表面上存在一个错误。我认为情况不太可能是这样,但更有趣的事情已经为人所知。

记录在案,我在Mac OS X 10.9.4 Mavericks上使用GCC 4.9.1和以下命令(显示警告消息)进行编译:

$ g++ -O3 -g  -std=c++11 -Wall -Wextra    -c Enemy.cpp
$ g++ -O3 -g  -std=c++11 -Wall -Wextra    -c PhysicsBody.cpp
PhysicsBody.cpp:8:43: warning: unused parameter ‘width’ [-Wunused-parameter]
 PhysicsBody* PhysicsBody::createBox(float width, float height, PhysicsBodyType type, float mass) {
                                           ^
PhysicsBody.cpp:8:56: warning: unused parameter ‘height’ [-Wunused-parameter]
 PhysicsBody* PhysicsBody::createBox(float width, float height, PhysicsBodyType type, float mass) {
                                                        ^
PhysicsBody.cpp:8:80: warning: unused parameter ‘type’ [-Wunused-parameter]
 PhysicsBody* PhysicsBody::createBox(float width, float height, PhysicsBodyType type, float mass) {
                                                                                ^
PhysicsBody.cpp:8:92: warning: unused parameter ‘mass’ [-Wunused-parameter]
 PhysicsBody* PhysicsBody::createBox(float width, float height, PhysicsBodyType type, float mass) {
                                                                                            ^
$ g++ -O3 -g  -std=c++11 -Wall -Wextra    -c main.cpp
$ g++ -o main *.o
$ ./main
$ echo $?
0
$