這篇文章主要是介紹如何在windows上部署SDL。
1、首先在浏覽器中輸入網址http://libsdl.org/download-2.0.php,找到Development Libraries,下面會有windows、max os、linux不同版本的庫,我們可以選擇自己電腦作業系統的版本進行下載下傳,我的電腦是windows64位,就選擇了圖中畫圈處進行下載下傳。
2、将上一步中下載下傳好的SDL檔案進行解壓縮,得到如下的檔案,這裡面我們将會用到的是lib和include兩個檔案夾:
3、找到自己的vs中vc檔案夾,我的是D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC,首先打開vc檔案夾中的include檔案夾,在裡面建立一個SDL(路徑為:D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\SDL,這裡我要啰嗦一句,建立這個SDL檔案夾是為了使頭檔案的放置更加規範,但這也有一個副作用,那就是我們在寫程式include這些頭檔案時,要加上SDL/,比如我們要使用SDL.h,那就是include<SDL/SDL.h>,這點要切記哦),然後将剛剛解壓縮的SDL檔案夾中的include中的檔案全部拷貝到這個建立的SDL中,如下圖所示:
4、在剛剛的vc檔案夾中打開lib檔案夾(路徑為:D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib),将剛剛我們解壓縮的SDL庫的檔案夾中的lib/x86檔案夾打開,會看到四個檔案,如下圖所示:
此時我們将三個以lib結尾的檔案拷貝到上面我們提到的lib檔案夾中,如下圖所示:
5、到這裡,我們會發現,lib下檔案夾中怎麼出現以dll結尾的檔案,這是程式在運作時用到的一個動态連結檔案,處理的辦法有兩種,一種是将它放在C:WINDOW/system32中(這是添加到系統中),另一種是将這個dll檔案放在我們項目編譯所得的exe檔案所在的檔案夾中,這裡我們采用這一種方法,下面将會介紹。
6、首先在vs中建立一個項目,這個步驟我這裡就省略了,建完項目如下圖:
7、下面我們來配置這個項目的屬性,打開項目屬性,進入到如下界面中:
接下來,我們點開左側的c/c++,然後點選代碼生成,在右側欄目運作庫中選擇多線程 DLL (/MD),然後點選确認:
再然後,我們點選左側的連結庫,然後點選輸入,在右側欄目的附加依賴項中點編輯,然後将SDL2.lib、SDL2main.lib和SDL2test.lib(這裡先聲明,這三個名字是我們解壓縮得到的檔案夾中x86檔案夾中的,依照具體填寫)填寫進去,然後點選确認:
8、至此,我們離成功便隻差一步了,大家一定會想到了那個dll檔案吧,是的,你沒猜錯,就是這個檔案,下面我們在檔案夾中打開這個檔案(我的是在D:\myhomewok\Second),并将SDL2檔案添加到exe所在檔案夾中(在vs中是Debug檔案夾,當然我們也可以把dll放在D:\myhomewok\Second\Second中,我選擇此種做法):
到此為止,我們的SDL已經部署好了,之後便可以使用了,下面我們找個示例程式進行測試,運作截圖如下:
到此,我們的SDL已經部署完成了(最後,附上我部署SDL的一個視訊連結:http://pan.baidu.com/s/1qYAgtE8)。
關于測試的代碼,我是在github上找的,如下:
/*
Copyright (C) 1997-2016 Sam Lantinga <[email protected]>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
#include <stdlib.h>
#include <stdio.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
#include "SDL/SDL_test_common.h"
static SDLTest_CommonState *state;
int done;
static const char *cursorNames[] = {
"arrow",
"ibeam",
"wait",
"crosshair",
"waitarrow",
"sizeNWSE",
"sizeNESW",
"sizeWE",
"sizeNS",
"sizeALL",
"NO",
"hand",
};
int system_cursor = -1;
SDL_Cursor *cursor = NULL;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
SDLTest_CommonQuit(state);
exit(rc);
}
void
loop()
{
int i;
SDL_Event event;
/* Check for events */
while (SDL_PollEvent(&event)) {
SDLTest_CommonEvent(state, &event, &done);
if (event.type == SDL_WINDOWEVENT) {
if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
SDL_Window *window = SDL_GetWindowFromID(event.window.windowID);
if (window) {
SDL_Log("Window %d resized to %dx%d\n",
event.window.windowID,
event.window.data1,
event.window.data2);
}
}
if (event.window.event == SDL_WINDOWEVENT_MOVED) {
SDL_Window *window = SDL_GetWindowFromID(event.window.windowID);
if (window) {
SDL_Log("Window %d moved to %d,%d (display %s)\n",
event.window.windowID,
event.window.data1,
event.window.data2,
SDL_GetDisplayName(SDL_GetWindowDisplayIndex(window)));
}
}
}
if (event.type == SDL_KEYUP) {
SDL_bool updateCursor = SDL_FALSE;
if (event.key.keysym.sym == SDLK_LEFT) {
--system_cursor;
if (system_cursor < 0) {
system_cursor = SDL_NUM_SYSTEM_CURSORS - 1;
}
updateCursor = SDL_TRUE;
} else if (event.key.keysym.sym == SDLK_RIGHT) {
++system_cursor;
if (system_cursor >= SDL_NUM_SYSTEM_CURSORS) {
system_cursor = 0;
}
updateCursor = SDL_TRUE;
}
if (updateCursor) {
SDL_Log("Changing cursor to \"%s\"", cursorNames[system_cursor]);
SDL_FreeCursor(cursor);
cursor = SDL_CreateSystemCursor((SDL_SystemCursor)system_cursor);
SDL_SetCursor(cursor);
}
}
}
for (i = 0; i < state->num_windows; ++i) {
SDL_Renderer *renderer = state->renderers[i];
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
#ifdef __EMSCRIPTEN__
if (done) {
emscripten_cancel_main_loop();
}
#endif
}
int
main(int argc, char *argv[])
{
int i;
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
SDL_assert(SDL_arraysize(cursorNames) == SDL_NUM_SYSTEM_CURSORS);
/* Initialize test framework */
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
if (!state) {
return 1;
}
for (i = 1; i < argc;) {
int consumed;
consumed = SDLTest_CommonArg(state, i);
if (consumed == 0) {
consumed = -1;
}
if (consumed < 0) {
SDL_Log("Usage: %s %s\n", argv[0], SDLTest_CommonUsage(state));
quit(1);
}
i += consumed;
}
if (!SDLTest_CommonInit(state)) {
quit(2);
}
for (i = 0; i < state->num_windows; ++i) {
SDL_Renderer *renderer = state->renderers[i];
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
}
/* Main render loop */
done = 0;
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
while (!done) {
loop();
}
#endif
SDL_FreeCursor(cursor);
quit(0);
/* keep the compiler happy ... */
return(0);
}