SDL 错误 LNK1120 & LNK2019
SDL error LNK1120 & LNK2019
我正在尝试从一本书中编译一个简单的 SDL 示例,但遇到了这些错误。我几乎可以肯定一切都已正确链接,因为我能够让其他 SDL 示例正常编译。我正在使用 Visual Studio 2013.
此代码旨在与 SDL 2.0 一起使用并链接到 SDL.lib,而我使用的是 SDL 2.0.3 并链接到 SDL2.lib。但是,我看不出有任何影响这里的原因。
Game.cpp
#include "Game.h"
#include <iostream>
Game::Game()
{
}
bool Game::init(const char* title, int xpos, int ypos, int width,
int height, int flags)
{
// attempt to initialize SDL
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
std::cout << "SDL init success\n";
// init the window
m_pWindow = SDL_CreateWindow(title, xpos, ypos,
width, height, flags);
if (m_pWindow != 0) // window init success
{
std::cout << "window creation success\n";
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
if (m_pRenderer != 0) // renderer init success
{
std::cout << "renderer creation success\n";
SDL_SetRenderDrawColor(m_pRenderer,
255, 255, 255, 255);
}
else
{
std::cout << "renderer init fail\n";
return false; // renderer init fail
}
}
else
{
std::cout << "window init fail\n";
return false; // window init fail
}
}
else
{
std::cout << "SDL init fail\n";
return false; // SDL init fail
}
std::cout << "init success\n";
m_bRunning = true; // everything inited successfully,start the main loop
return true;
}
void Game::render()
{
SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
SDL_RenderPresent(m_pRenderer); // draw to the screen
}
void Game::handleEvents()
{
SDL_Event event;
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
void Game::clean()
{
std::cout << "cleaning game\n";
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();
}
Game.h
#ifndef __Game__
#define __Game__
#include "SDL.h"
class Game
{
public:
Game();
~Game();
bool init(const char* title, int xpos, int ypos, int width, int
height, int flags);
void render();
void update();
void handleEvents();
void clean();
bool running() { return m_bRunning; }
private:
SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;
bool m_bRunning;
};
#endif /* defined(__Game__) */
Main.cpp
#include "Game.h"
// our Game object
Game* g_game = 0;
int main(int argc, char* argv[])
{
g_game = new Game();
g_game->init("Chapter 1", 100, 100, 640, 480, 0);
while (g_game->running())
{
g_game->handleEvents();
g_game->update();
g_game->render();
}
g_game->clean();
return 0;
}
以下是我收到的errors/warnings:
Error 3 error LNK1120: 1 unresolved externals c:\users\alexn\documents\visual studio 2013\Projects\SDL_template2\Debug\SDL_template2.exe SDL_template2
Error 2 error LNK2019: unresolved external symbol "public: void __thiscall Game::update(void)" (?update@Game@@QAEXXZ) referenced in function _SDL_main c:\Users\alexn\documents\visual studio 2013\Projects\SDL_template2\SDL_template2\Main.obj SDL_template2
Warning 1 warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library c:\Users\alexn\documents\visual studio 2013\Projects\SDL_template2\SDL_template2\MSVCRTD.lib(cinitexe.obj) SDL_template2
您正在从您的 main() 调用 Game::update(),但您似乎并没有真正实现它。
关于警告,请参阅this question了解更多信息。您可能正在尝试 link 使用使用不同 C 运行时构建的 SDL 版本(或其他一些库)。
我正在尝试从一本书中编译一个简单的 SDL 示例,但遇到了这些错误。我几乎可以肯定一切都已正确链接,因为我能够让其他 SDL 示例正常编译。我正在使用 Visual Studio 2013.
此代码旨在与 SDL 2.0 一起使用并链接到 SDL.lib,而我使用的是 SDL 2.0.3 并链接到 SDL2.lib。但是,我看不出有任何影响这里的原因。
Game.cpp
#include "Game.h"
#include <iostream>
Game::Game()
{
}
bool Game::init(const char* title, int xpos, int ypos, int width,
int height, int flags)
{
// attempt to initialize SDL
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
std::cout << "SDL init success\n";
// init the window
m_pWindow = SDL_CreateWindow(title, xpos, ypos,
width, height, flags);
if (m_pWindow != 0) // window init success
{
std::cout << "window creation success\n";
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
if (m_pRenderer != 0) // renderer init success
{
std::cout << "renderer creation success\n";
SDL_SetRenderDrawColor(m_pRenderer,
255, 255, 255, 255);
}
else
{
std::cout << "renderer init fail\n";
return false; // renderer init fail
}
}
else
{
std::cout << "window init fail\n";
return false; // window init fail
}
}
else
{
std::cout << "SDL init fail\n";
return false; // SDL init fail
}
std::cout << "init success\n";
m_bRunning = true; // everything inited successfully,start the main loop
return true;
}
void Game::render()
{
SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
SDL_RenderPresent(m_pRenderer); // draw to the screen
}
void Game::handleEvents()
{
SDL_Event event;
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
void Game::clean()
{
std::cout << "cleaning game\n";
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();
}
Game.h
#ifndef __Game__
#define __Game__
#include "SDL.h"
class Game
{
public:
Game();
~Game();
bool init(const char* title, int xpos, int ypos, int width, int
height, int flags);
void render();
void update();
void handleEvents();
void clean();
bool running() { return m_bRunning; }
private:
SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;
bool m_bRunning;
};
#endif /* defined(__Game__) */
Main.cpp
#include "Game.h"
// our Game object
Game* g_game = 0;
int main(int argc, char* argv[])
{
g_game = new Game();
g_game->init("Chapter 1", 100, 100, 640, 480, 0);
while (g_game->running())
{
g_game->handleEvents();
g_game->update();
g_game->render();
}
g_game->clean();
return 0;
}
以下是我收到的errors/warnings:
Error 3 error LNK1120: 1 unresolved externals c:\users\alexn\documents\visual studio 2013\Projects\SDL_template2\Debug\SDL_template2.exe SDL_template2
Error 2 error LNK2019: unresolved external symbol "public: void __thiscall Game::update(void)" (?update@Game@@QAEXXZ) referenced in function _SDL_main c:\Users\alexn\documents\visual studio 2013\Projects\SDL_template2\SDL_template2\Main.obj SDL_template2
Warning 1 warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library c:\Users\alexn\documents\visual studio 2013\Projects\SDL_template2\SDL_template2\MSVCRTD.lib(cinitexe.obj) SDL_template2
您正在从您的 main() 调用 Game::update(),但您似乎并没有真正实现它。
关于警告,请参阅this question了解更多信息。您可能正在尝试 link 使用使用不同 C 运行时构建的 SDL 版本(或其他一些库)。