gpt4 book ai didi

双重包含的C++/SDL问题

转载 作者:行者123 更新时间:2023-11-27 22:29:52 26 4
gpt4 key购买 nike

我从编译器得到这个错误:

1>Linking...
1>main.obj : error LNK2005: "int g_win_flags" (?g_win_flags@@3HA) already defined in init.obj
1>main.obj : error LNK2005: "struct SDL_Surface * g_screen" (?g_screen@@3PAUSDL_Surface@@A) already defined in init.obj
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>.\Debug\Heroes are back!.exe : fatal error LNK1169: one or more multiply defined symbols found

看起来g_win_flags 和g_screen 被包含了两次,但我不明白为什么。这是来源:

主要.cpp

#include <iostream>
#include "dec.h"
#include "init.h"

int main(int argc, char *argv[]){

init();
return 0;
}

12月.h

#ifndef DEC_H
#define DEC_H

#include <SDL.h>
#include <iostream>

#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")

using namespace std;

int g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF;

SDL_Surface *g_screen = NULL;

#endif

初始化.h

#ifndef INIT_H
#define INIT_H

bool init();

#endif

初始化.cpp

#include "dec.h"

bool init(){
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1){
cerr << "Unable to initialize SDL" << endl;
return false;
}
g_screen = SDL_SetVideoMode(640, 480, 0, g_win_flags);

return true;
}

有人可以帮忙吗?提前致谢,祝您有愉快的一天:)

最佳答案

您在 header 中定义和初始化变量。

您应该只在 header (dec.h) 中声明它们而无需任何初始化程序:

extern int g_win_flags;
extern SDL_Surface *g_screen;

然后在一个文件中定义它们一次 - 可能是 dec.cpp - 并进行初始化。

实际上,您在每个包含“dec.h”的源文件中定义它们,然后违反了 ODR - 一个定义规则。

关于双重包含的C++/SDL问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com