LNK2019-未解析的外部符号
LNK2019 - Unresolved external symbol
我试图通过查看旧的问题和答案来找到这个问题的解决方案,但我找不到我的问题出了什么问题。我得到以下错误:
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)
这两个函数之间的参数数量不同。
出现的问题:
- 哪个是正确的定义
- 这个错误的定义是如何被使用的
- 错误使用的声明在哪里
您可能需要简单地重新编译所有内容。您可能需要查看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
$
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 类模板上一个特定函数的未解析外部符号
- LNK2001:未解析的外部符号public:static类std::vector