错误:找到一个或多个多重定义符号 我正在建立我的第一个适当的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"