简体   繁体   English

SDL C ++多定义错误

[英]SDL C++ Multiple definition error

In my file I can't figure out why I'm getting multiple definition errors. 在我的文件中,我无法弄清楚为什么会出现多个定义错误。 I'm getting them for an "SDL_Surface" called "screen". 我正在为名为“屏幕”的“ SDL_Surface”获取它们。

screen is located within render.h. 屏幕位于render.h中。 I've tried making it extern but it still throws an error. 我尝试过使其变为外部,但仍然会引发错误。 I've looked up quite a bit but I can't find a solution. 我已经看了很多,但找不到解决方案。

Here are the files in question: 这是有问题的文件:

main.cpp main.cpp中

//The headers
#include <iostream>
#include <string>
#include <vector>
#include "SDL/SDL.h"
#include "render.h"
#include "Entities.h"

//The surfaces that will be used
SDL_Surface *civilian = NULL;
SDL_Surface *background = NULL;

int main( int argc, char* args[])
{
    //initialize all of SDL systems
    INIT();

    //Load the images
    civilian = load_image("civilian.png");
    background = load_image("background.png");

    //Apply the background to the screen
    apply_surface(0,0, background, screen);

    //apply the civilian to the screen
    apply_surface(180, 140, civilian, screen);

    //update the screen
    if(SDL_Flip( screen ) == -1)
    {
        return 1;
    }

    //Wait 2 seconds
    SDL_Delay(2000);

    //free the surfaces
    SDL_FreeSurface(civilian);
    SDL_FreeSurface(background);

    //Quit SDL
    SHUTDOWN();

    return 0;
}

render.cpp render.cpp

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <string>
#include "render.h"

bool INIT()
{
    //start SDL
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return false;
    };

    //Set up the screen
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

    //if there was an error setting up the screen
    if(screen == NULL)
    {
        return false;
    }

    //set the window caption
    SDL_WM_SetCaption("Zombie!", NULL);

    //if everything initialized fine
    return true;
}

void SHUTDOWN()
{
    //Free images eventually an if statement and array that stores all the images that need to be loaded
    // SDL_FreeSurface(image);

    //Quit SDL
    SDL_Quit();


}

//Optimized image loading function
SDL_Surface *load_image(std::string filename)
{
    //temporary storage for the image that's loaded
    SDL_Surface* loadedImage = NULL;
    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
    loadedImage = IMG_Load(filename.c_str());

    //If nothing went wrong in loading the image
    if(loadedImage != NULL)
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat(loadedImage);

        //Free the old image
        SDL_FreeSurface(loadedImage);
    }
    return optimizedImage;
}


void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination)
{
    //Make a temporary rect to hold the offsets
    SDL_Rect offset;
    //Give the offsets to the rectangle
    offset.x = x;
    offset.y = y;

    //Blit the surface
    SDL_BlitSurface(source, NULL, destination, &offset);
}

/*bool load_files()
{
    //load the image
    image = load_image( "civilian.png");

    //If there was an error in loading the image
    if (image == NULL)
    {
        return false;
    }
    //if everything loaded fine
    return true;
}
*/

//Event handling
SDL_Event event;

render.h render.h

#ifndef RENDER_H_INCLUDED
#define RENDER_H_INCLUDED

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *screen = NULL;

struct Images
{
    std::string filename; //The name of the file to be loaded
    SDL_Surface* image; //set to null when created
    bool optimized; //set to false when created

};

extern Images ImageFiles[10];

//initialize all of SDL subsystems
bool INIT();

//quit SDL
void SHUTDOWN();

void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination);

//Optimized image loading function
SDL_Surface *load_image(std::string filename);

#endif // RENDER_H_INCLUDED

Here's the error: 这是错误:

obj\\Debug\\render.o||In function Z4INITv':| C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\render.cpp|11|multiple definition of obj \\ Debug \\ render.o ||在函数Z4INITv':| C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\render.cpp|11|multiple definition of Z4INITv':| C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\render.cpp|11|multiple definition of screen'| Z4INITv':| C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\render.cpp|11|multiple definition of屏幕的Z4INITv':| C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\render.cpp|11|multiple definition of '| obj\\Debug\\main.o:C:\\Users\\Joshua\\Documents\\CodeBlocks\\Simulation\\Zombie Survival\\main.cpp|20|first defined here| obj \\ Debug \\ main.o:C:\\ Users \\ Joshua \\ Documents \\ CodeBlocks \\ Simulation \\ Zombie Survival \\ main.cpp | 20 |此处首次定义| ||=== Build finished: 2 errors, 0 warnings (0 minutes, 1 seconds) ===| || ===构建完成:2个错误,0个警告(0分钟,1秒)=== |

Remove SDL_Surface *screen = NULL; 删除SDL_Surface *screen = NULL; from render.h. 从render.h。
Declare SDL_Surface *screen = NULL; 声明SDL_Surface *screen = NULL; in render.cpp. 在render.cpp中。
Declare extern SDL_Surface *screen; 声明extern SDL_Surface *screen; in main.cpp. 在main.cpp中。

Since, a commentor asked for an explanation, I am explaining how C++ compiler behave. 由于评论员要求作出解释,因此我在解释C ++编译器的行为。

C++ compiler compiles each source file (.cpp) as a single compilation unit. C ++编译器将每个源文件(.cpp)编译为一个编译单元。 If SDL_Surface* screen = NULL; 如果SDL_Surface* screen = NULL; is declared in render.h, each compilation unit will have one copy of the global variable screen (see external linkage ). 在render.h中声明时,每个编译单元将具有全局变量screen一个副本(请参阅外部链接 )。 Now, when the linker combines these compilation unit, it sees two copies of the same global variable name and errors out. 现在,当链接程序组合这些编译单元时,它会看到两个具有相同全局变量名称的副本,并且会出错。

The simplest way to fix this problem is to open render.h and replace 解决此问题的最简单方法是打开render.h并替换

SDL_Surface *screen = NULL;

with

SDL_Surface *screen;

Explanation: 说明:

Each time you include render.h from a different .cpp file, it will try to initialize the screen. 每次您从不同的.cpp文件包含render.h时,它将尝试初始化屏幕。 This is a problem. 这是个问题。

I've found that you can define screens multiple times, but you cannot initialize them multiple times. 我发现可以多次定义屏幕,但是不能多次对其进行初始化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM