use*_*079 8 c++ linker sdl reference undefined
我不知道为什么这段代码不起作用.所有的源文件都编译好了,但是当我尝试链接它们时,编译器会因为未定义的引用错误而对我大喊大叫.这是代码:
main.cpp中:
#include "SDL/SDL.h"
#include "Initilize.cpp"
int main(int argc, char* args[])
{
//Keeps the program looping
bool quit = false;
SDL_Event exit;
//Initilizes, checks for errors
if(Initilize::Start() == -1)
{
SDL_Quit();
}
//main program loop
while(quit == false)
{
//checks for events
while(SDL_PollEvent(&exit))
{
//checks for type of event;
switch(exit.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Initilize.h:
#ifndef INITILIZE_H
#define INITILIZE_H
#include "SDL/SDL.h"
/* Declares surface screen, its attributes, and Start(); */
class Initilize {
protected:
static SDL_Surface* screen;
private:
static int SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP;
public:
static int Start();
};
#endif
Run Code Online (Sandbox Code Playgroud)
Initilize.cpp:
#include "Initilize.h"
#include "SDL/SDL.h"
/* Initilizes SDL subsystems, sets the screen, and checks for errors */
int Initilize::Start()
{
//screen attributes
SCREEN_WIDTH = 640;
SCREEN_HEIGHT = 480;
//Bits per pixel
SCREEN_BPP = 32;
//Inits all subsystems, if there's an error, return 1
if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
return 1;
}
//sets screen
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
//Returns 1 if there was in error with setting the screen
if(screen == NULL) {
return 1;
}
SDL_WM_SetCaption("Game", NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果代码格式化很奇怪,插入四个空格放入代码块会搞砸一些东西.
Jes*_*ood 16
将以下内容添加到cpp文件中:
SDL_Surface* Initilize::screen = 0; // or nullptr
int Initilize::SCREEN_WIDTH = 640;
int Initilize::SCREEN_HEIGHT = 480;
int Initilize::SCREEN_BPP = 32;
Run Code Online (Sandbox Code Playgroud)
而且,如果这些价值永远不会改变,那么制作它们会很好const.您需要将上述内容添加到cpp文件中的原因是因为需要在类外部定义静态成员变量.static SDL_Surface* screen;在你的类里面只是一个声明,而不是一个定义.static成员被认为是特殊的,与全局变量非常相似.
这样做的原因是因为静态成员在类的所有实例之间共享.这意味着它们只能被定义一次,并且允许类中的定义会导致多个定义发生,因此C++标准强制您在类之外定义它(并且还暗示您应该将定义放在cpp文件中).
看来您从未初始化过您的 vairables。您在 Initialize start 方法中分配它们,但没有初始化它们。尝试在源文件中分配它之前添加 a ,int SCREENWIDTH;而不仅仅是头文件
| 归档时间: |
|
| 查看次数: |
19037 次 |
| 最近记录: |