是什么导致了这些链接器错误?(视觉C++ LNK2005)
What's causing these linker errors? (Visual C++ LNK2005)
我是一名新手程序员,仍在努力学习C++和OOP设计基础知识。我一直在努力自学的项目是一个C++游戏,它有多个类、文件、状态等。然而,我在文件组织方面一直遇到障碍,从简单地在哪里创建对象到编译破坏链接器错误。
下面是一个我一直在得到的一些错误的例子:
1>SMGA.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>SplashScreenState.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>StateManager.obj : error LNK2005: "class StateManager gameStateManager" (?gameStateManager@@3VStateManager@@A) already defined in Engine.obj
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
我在网上查了一下,发现了很多类似的问题,包括错误的include保护或包含.cpp文件而不是.h文件。但我的代码中还没有这样做,所以我不知所措。
现在,我猜这个错误告诉我,我试图创建Engine类的smgaEngine对象(和StateManager类的gameStateManager对象)两次,但我不确定为什么。。。
这两个对象(smgaEngine和gameStateManager)的突出之处在于,我在类声明之后立即在它们对应的类'.h文件中声明了它们。这会是问题吗?-它们仍然在包含保护范围内,我不太确定还能把它们放在我的代码中的哪里。。。这种草率的编码会导致链接器错误吗?
这是一个可疑的类别。。。
#ifndef ENGINE_H
#define ENGINE_H
#include <SDL.h>
#include "Timer.h"
class Engine
{
private:
static const int screenWidth = 480;
static const int screenHeight = 270;
static const int screenBPP = 24;
bool running;
SDL_Surface *mainScreen;
SDL_Event eventHolder;
Timer fpsTimer;
public:
Engine();
~Engine();
void init();
void handleEvents();
void handleLogic();
void handleRender();
void cleanUp();
SDL_Event *getEvent();
SDL_Surface *getMainScreen();
bool isRunning();
void setRunning(bool tempRunning);
} smgaEngine;
#endif
这是另一个:
#ifndef STATEMANAGER_H
#define STATEMANAGER_H
#include "SplashScreenState.h"
#include <vector>
class GameState;
class StateManager
{
private:
std::vector<GameState*> stateStack;
SplashScreenState *splashState;
public:
StateManager();
~StateManager();
void init();
void changeState( GameState *tempNextState );
void addState( GameState *tempNextState );
void removeState();
//returns the back() element of the stateStack vector..
GameState* getTopState();
void handleEvents();
void handleLogic();
void handleRender();
} gameStateManager;
#endif
我一直在尽力学习C++和OOP,但我真的很挣扎。似乎每次我试图用封装的类制作干净的代码时,我都会陷入混乱。我试图防止高度的类耦合,但我经常以链接器错误或缺乏类之间通信的能力而告终。。。是在头文件中创建类实例对象导致了这些错误,还是其他原因?如果这是我的链接器错误的原因,那么我应该在哪里创建这些对象?
您在头文件中定义了两个全局变量smgaEngine
和gameStateManager
,并将这些头文件包含在两个(或多个)源文件中。所以你会得到多个定义错误。Include guard不会阻止头文件在不同的源文件中被包含两次(它们怎么可能?)它们会阻止头文件被包含在同一源文件中两次。
你很接近正确答案(至少你对这个问题有很好的理解)。正确的方法是这个
// header file Engine.h
class Engine
{
};
extern Engine smgaEngine;
// in one source file (say Engine.cpp)
Engine smgaEngine;
现在,头文件中有一个声明(extern
使其成为声明),但源文件中有定义。可以有任意多个声明(只要它们是一致的),但必须只有一个定义。因此,对于全局变量,将声明放在头文件中,并将定义放在其中一个源文件中。
- 视觉studo 2019中的漫画和静态/动态绑定
- 如何改变c++应用程序的视觉效果
- 视觉工作室项目.提取源文件夹名称
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 视觉我希望一个函数在另一个函数C++中进行计算
- 视觉 如何循环访问C++中遵循类似格式的多个.txt文件?
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 背包问题,视觉工作室问题
- 如何在视觉c ++项目中添加箭头键作为修饰键Microsoft
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 视觉C++未按所需顺序打印
- 视觉C++使用 map 来比较字符串中的每个单词
- C++11 中好友模板类的视觉C++错误
- 迭代器跳闸视觉C++ 2017 断言
- 视觉C++联盟,垃圾价值
- 无法安装由视觉C++制作的apk
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 使用外部文件中的变量进行视觉C++