错误:找到一个或多个多重定义符号 我正在建立我的第一个适当的SDL项目和C++项目,但是我正在犯错。最后一个错误是找到一个或多个多重定义符号。除了这个错误,我还遇到了一系列错误,其中之一是: Severity Code Description Project File Line Suppression State Error LNK2005 "public: bool __thiscall Game::init(void)" (?init@Game@@QAE_NXZ) already defined in game.obj learnSDL C:\Users\myself\source\repos\learn\learn\main.obj
我得到的所有其他错误也都是相同的格式,但它们是针对游戏类中的不同属性的错误:找到一个或多个多重定义符号 我正在建立我的第一个适当的SDL项目和C++项目,但是我正在犯错。最后一个错误是找到一个或多个多重定义符号。除了这个错误,我还遇到了一系列错误,其中之一是: Severity Code Description Project File Line Suppression State Error LNK2005 "public: bool __thiscall Game::init(void)" (?init@Game@@QAE_NXZ) already defined in game.obj learnSDL C:\Users\myself\source\repos\learn\learn\main.obj,c++,sdl,C++,Sdl,我得到的所有其他错误也都是相同的格式,但它们是针对游戏类中的不同属性的 game.h: #pragma once #include <iostream> #include "SDL.h" class Game { public: bool init(); bool constructWindow ( const char* windowName, uint16_t xWindowPos,
game.h
:
#pragma once
#include <iostream>
#include "SDL.h"
class Game
{
public:
bool init();
bool constructWindow
(
const char* windowName,
uint16_t xWindowPos,
uint16_t yWindowPos,
uint16_t windowWidth,
uint16_t windowHeight,
bool fullScreen = false
);
void render();
void update();
SDL_Window* getWindow();
bool handleEvents();
protected:
private:
SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
SDL_Event event;
bool quit = true;
};
我不确定main是否与问题有关,但无论如何,这里是:
#include "game.cpp"
int main(int argc, char* argv[])
{
Game app;
if (app.init())
if (app.constructWindow("3D Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1200, 600))
while (!app.handleEvents())
{
app.render();
app.update();
}
SDL_DestroyWindow(app.getWindow());
SDL_Quit();
}
我不确定主要问题是否与这个问题有关
哦,是的,是的!:-)
通过将game.cpp
包含到main.cpp
中,可以定义game.cpp
中的所有内容两次,一次在main
对象文件中,一次在game
对象文件中。对象文件不是实现所必需的,但它们很常见,可以用作解释。在任何情况下,错误消息中提到的game.obj
都表明您的环境确实使用了它们
包含一个文件实际上只是用文件的内容替换了#include
行,解释了为什么两个对象文件最终具有相同的定义
然后,当您将两个对象文件链接在一起时,瞧,定义了两次符号
您通常不应该将cpp
文件包含到其他cpp
文件中,因为它们往往定义您不希望有多个副本的内容。相反,您应该包含头文件,头文件往往只是声明内容
这是一个重要的区别,我向学生解释如下。声明只是声明某事物存在,而不是实际创建它。你可以想做多少次就做多少次。另一方面,一个定义使它成为现实,你真的只想做一次
如果你想理解这一点,而不是我简化的解释所提供的内容,那么你应该调查这个问题
#include "game.cpp"
你的问题是:
因为#include
(几乎)只不过是将给定文件复制并粘贴到包含另一个文件的文件中
这成为一个问题,因为C++中所谓的一个定义规则:允许bool Game::init()
定义一次,但由于包含.cpp,实际上定义了两次
这就是标题的作用,您只需声明它。由于声明但不定义两次是可以的,您可以安全地`包含它。永远不要包含
.cpp
文件。在main.cpp
中,您应该有#包含“game.h”
为什么#包含“game.cpp”
?您不包括.cpp文件正是出于这个原因。
#include "game.cpp"