"Unresolved external symbol" 对于全局变量
"Unresolved external symbol" for global variables
我创建了一个全局文件 (Globals.h) 来保存我的全局渲染器 (gRenderer) 和我的全局 window (gWindow )。我将它们声明为 extern 因为它们将在 initWindow() & initRenderer() 函数中定义在 InitChess.cpp.
下
链接器抱怨我有“未解析的外部符号”的某些原因,即使我在 InitWindow.cpp.
下的函数中定义了它们
错误:
Severity Code Description Project File Line Suppression State Error LNK2001 unresolved external symbol "struct SDL_Window * gWindow" (?gWindow@@3PEAUSDL_Window@@EA) Chess C:\Users\source\repos\Chess\Chess\InitChess.obj
Severity Code Description Project File Line Suppression State Error LNK2001 unresolved external symbol "struct SDL_Renderer * gRenderer" (?gRenderer@@3PEAUSDL_Renderer@@EA) Chess C:\Users\source\repos\Chess\Chess\InitChess.obj
Chess.cpp:
#include "SDL.h"
#undef main
#include <iostream>
#include "../include/InitChess.h"
int main()
{
InitChess* e = new InitChess;
e->initWindow();
e->initRenderer();
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
return 3;
}
delete e;
return 0;
}
InitChess.h:
#pragma once
#include "SDL.h"
#include "../include/Globals.h"
class InitChess {
public:
void initWindow();
void initRenderer();
~InitChess();
private:
};
InitChess.cpp:
#include "../include/InitChess.h"
void InitChess::initWindow()
{
SDL_Window* createdWindow;
createdWindow = SDL_CreateWindow(
"An SDL2 window", // window title
SDL_WINDOWPOS_UNDEFINED, // initial x position
SDL_WINDOWPOS_UNDEFINED, // initial y position
640, // width, in pixels
480, // height, in pixels
SDL_WINDOW_OPENGL // flags
);
// assign created window to global window variable in Globals.h
gWindow = createdWindow;
}
void InitChess::initRenderer()
{
SDL_Renderer* createdRenderer;
createdRenderer = SDL_CreateRenderer(gWindow, -1, 0);
// assign created render to global renderer variable in Globals.h
gRenderer = createdRenderer;
}
InitChess::~InitChess()
{
SDL_DestroyRenderer(gRenderer);
SDL_Quit();
}
Globals.h:
#pragma once
#include "SDL.h"
#ifndef GLOBALS_H
#define GLOBALS_H
extern SDL_Window* gWindow;
extern SDL_Renderer* gRenderer;
#endif
声明和定义之间存在差异。
平时写作
SDL_Window* gWindow;
是变量gWindow
.
的声明和定义
您的程序使用的每个(非内联)变量都可以有多个声明,但必须完全一个定义。
在 SDL_Window* gWindow;
之前放置 extern
会使声明不是定义。
因此您仍然需要在某处放置 gWindow
的定义。这必须在程序中只出现 一次,因此您不能将定义放在可能包含在多个 .cpp
文件中的头文件中。
您需要选择一个 .cpp
文件并将定义 SDL_Window* gWindow;
放在那里。定义必须在全局范围内,否则它不会引用与 Globals.h
.
中的声明 extern SDL_Window* gWindow;
相同的变量
在您的代码中,该文件似乎应该是 InitChess.cpp
,但根据您的设计,最好创建一个 Globals.cpp
并将定义放在那里。
// assign created window to global window variable in Globals.h
gWindow = createdWindow;
这不是定义,甚至不是声明。它只是一个赋值表达式。变量的声明以其类型名称开头。但是如前所述,简单地将SDL_Window*
放在这一行的前面将不会定义在Globals.h
中声明的全局变量。相反,它会在函数中声明并定义一个新的 local 同名变量。
我创建了一个全局文件 (Globals.h) 来保存我的全局渲染器 (gRenderer) 和我的全局 window (gWindow )。我将它们声明为 extern 因为它们将在 initWindow() & initRenderer() 函数中定义在 InitChess.cpp.
下链接器抱怨我有“未解析的外部符号”的某些原因,即使我在 InitWindow.cpp.
下的函数中定义了它们错误:
Severity Code Description Project File Line Suppression State Error LNK2001 unresolved external symbol "struct SDL_Window * gWindow" (?gWindow@@3PEAUSDL_Window@@EA) Chess C:\Users\source\repos\Chess\Chess\InitChess.obj
Severity Code Description Project File Line Suppression State Error LNK2001 unresolved external symbol "struct SDL_Renderer * gRenderer" (?gRenderer@@3PEAUSDL_Renderer@@EA) Chess C:\Users\source\repos\Chess\Chess\InitChess.obj
Chess.cpp:
#include "SDL.h"
#undef main
#include <iostream>
#include "../include/InitChess.h"
int main()
{
InitChess* e = new InitChess;
e->initWindow();
e->initRenderer();
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
return 3;
}
delete e;
return 0;
}
InitChess.h:
#pragma once
#include "SDL.h"
#include "../include/Globals.h"
class InitChess {
public:
void initWindow();
void initRenderer();
~InitChess();
private:
};
InitChess.cpp:
#include "../include/InitChess.h"
void InitChess::initWindow()
{
SDL_Window* createdWindow;
createdWindow = SDL_CreateWindow(
"An SDL2 window", // window title
SDL_WINDOWPOS_UNDEFINED, // initial x position
SDL_WINDOWPOS_UNDEFINED, // initial y position
640, // width, in pixels
480, // height, in pixels
SDL_WINDOW_OPENGL // flags
);
// assign created window to global window variable in Globals.h
gWindow = createdWindow;
}
void InitChess::initRenderer()
{
SDL_Renderer* createdRenderer;
createdRenderer = SDL_CreateRenderer(gWindow, -1, 0);
// assign created render to global renderer variable in Globals.h
gRenderer = createdRenderer;
}
InitChess::~InitChess()
{
SDL_DestroyRenderer(gRenderer);
SDL_Quit();
}
Globals.h:
#pragma once
#include "SDL.h"
#ifndef GLOBALS_H
#define GLOBALS_H
extern SDL_Window* gWindow;
extern SDL_Renderer* gRenderer;
#endif
声明和定义之间存在差异。
平时写作
SDL_Window* gWindow;
是变量gWindow
.
您的程序使用的每个(非内联)变量都可以有多个声明,但必须完全一个定义。
在 SDL_Window* gWindow;
之前放置 extern
会使声明不是定义。
因此您仍然需要在某处放置 gWindow
的定义。这必须在程序中只出现 一次,因此您不能将定义放在可能包含在多个 .cpp
文件中的头文件中。
您需要选择一个 .cpp
文件并将定义 SDL_Window* gWindow;
放在那里。定义必须在全局范围内,否则它不会引用与 Globals.h
.
extern SDL_Window* gWindow;
相同的变量
在您的代码中,该文件似乎应该是 InitChess.cpp
,但根据您的设计,最好创建一个 Globals.cpp
并将定义放在那里。
// assign created window to global window variable in Globals.h
gWindow = createdWindow;
这不是定义,甚至不是声明。它只是一个赋值表达式。变量的声明以其类型名称开头。但是如前所述,简单地将SDL_Window*
放在这一行的前面将不会定义在Globals.h
中声明的全局变量。相反,它会在函数中声明并定义一个新的 local 同名变量。