第一步是在系統上安裝SDL2開發庫,您可以從SDL2下載頁面下載它們。
C ++ 11注意
由於C ++ 11提供了許多我想使用的強大新功能,因此您需要一個支持新標准的編譯器。如今,在Visual Studio 2013及更高版本中,任何現代編譯器都兼容(或對我們而言足夠接近),包括gcc,clang和msvc。使用clang和gcc時,請確保包含C ++ 11標志-std=c++11
,或者如果您的編譯器較舊,請確保 -std=c++0x
。Visual Studio 2012及更高版本中默認啟用C ++ 11功能。
確保一切正常
現在您已經在計算機上設置了庫,我們將通過一個非常簡單的項目對所有內容進行測試。我建議使用CMake來生成可執行文件,因為它可以為幾乎任何平台和IDE生成make文件或項目文件,並且是我將在本課程中使用的生成系統,因此易於遵循。
CMake
CMake對於構建課程非常有用,因為它使我們能夠為幾乎任何平台和IDE生成make文件或項目文件。它還有助於解決依賴關系(例如SDL2),特定於平台的配置等等。如果您不熟悉CMake,可以在他們的網站上找到不錯的介紹,以幫助您入門。
Windows用戶:
由於Windows沒有像Linux和OS X CMake這樣的標准包含目錄或庫目錄,因此在解決依賴項時會遇到一些麻煩,因此我們需要幫助。我已經將現有的FindSDL2模塊用於CMake,並對其進行了一些修改以檢查名為的環境變量
SDL2
。您應該創建此環境變量,並使其指向包含先前下載的SDL2標頭和庫的文件夾的根目錄級別。
要查找SDL2,我們需要一個模塊來查找所需的依賴項。通常,這些包含在CMake發行版中,但對於某些較新的庫,它們可能尚未集成。對於SDL2,我們需要提供我們自己的模塊來查找依賴關系。該模塊可在線上或在課程庫中找到。對於Windows用戶,我建議使用存儲庫中的修改后的版本,因為它還會檢查您的SDL2
環境變量。現有的FindSDL2.cmake可以在Linux和Mac上運行,但是可能無法在Windows上找到這些庫。
我們的項目的CMakeLists.txt文件
我們的主要CMakeLists文件需要做一些事情,以便我們可以輕松地構建我們的項目:
- 附加到CMake模塊路徑,以便我們可以找到修改后的SDL2模塊。
- 設置一個安裝目錄(
BIN_DIR
在此處稱為),供我們安裝可執行文件時參考。 - 查找SDL2,然后將SDL2包含目錄添加到包含路徑。
- 添加Lesson0子目錄以找到本課程的CMakeLists.txt,以便我們進行構建。
此CMakeLists.txt文件應位於課程的項目文件夾的頂級目錄中。
cmake_minimum_required(VERSION 2.6) project(TwinklebearDevLessons) # Use our modified FindSDL2* modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${TwinklebearDevLessons_SOURCE_DIR}/cmake") # Set an output directory for our binaries set(BIN_DIR ${TwinklebearDevLessons_SOURCE_DIR}/bin) # Bump up warning levels appropriately for clang, gcc & msvc # Also set debug/optimization flags depending on the build type. IDE users choose this when # selecting the build mode in their IDE if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O2") elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC") if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() endif() # Look up SDL2 and add the include directory to our include path find_package(SDL2 REQUIRED) include_directories(${SDL2_INCLUDE_DIR}) # Look in the Lesson0 subdirectory to find its CMakeLists.txt so we can build the executable add_subdirectory(Lesson0)
測試程序
我們正在為本課程構建的程序是對SDL的簡單健全性檢查。它將 初始化 SDL視頻子系統,檢查是否有 錯誤,然后退出。我們的構建系統將在Lesson0 / src / main.cpp下查找此文件。如果將其放置在其他位置,則需要更新CMakeLists文件中的文件名和子目錄。
#include <iostream> #include <SDL.h> /* * Lesson 0: Test to make sure SDL is setup properly */ int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; }
要為Lesson0構建可執行文件,我們需要在Lesson0目錄中另一個CMakeLists.txt文件,由於我們已經添加了要搜索的子目錄,因此我們的主CMakeLists文件將對其進行檢查。在這里,我們只是添加要從源文件構建的可執行文件,並告訴CMake將可執行文件鏈接到SDL2庫。我們還添加了一個安裝目標,以將可執行文件安裝到我們的二進制目錄中。
project(Lesson0) add_executable(Lesson0 src/main.cpp) target_link_libraries(Lesson0 ${SDL2_LIBRARY}) install(TARGETS Lesson0 RUNTIME DESTINATION ${BIN_DIR})
如果您一直在使用本課程中使用的文件夾層次結構,則現在應該有類似的內容。
TwinklebearDevLessons/ CMakeLists.txt Lesson0/ CMakeLists.txt src/ main.cpp cmake/ FindSDL2.cmake
用CMake構建
為了使用CMake來構建項目,我們需要創建一個臨時的構建目錄來存儲各種構建工件,因此我們不會用一堆垃圾來污染源目錄。然后cmake -G "Your Generator" ../
,我們可以從此文件夾中運行CMake來生成makefile或project文件Your Generator
。您可以運行cmake -H
以查看系統上可用的生成器。您還可以使用來指定構建類型-DCMAKE_BUILD_TYPE=Type
,傳遞Debug將使用我們上面設置的調試標志,以及Release的設置。我建議使用調試標志進行構建,因為這樣可以更輕松地跟蹤調試器的問題。下面顯示了在調試模式下構建Unix Makefiles目標的示例運行。
$ mkdir build && cd build $ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ../ $ make $ make install
在此示例中,將在build目錄中生成常規Unix Makefile,因此現在可以使用make來構建項目。運行make install
會將我們指定的所有目標(我們的Lesson0二進制文件)安裝到它們的安裝位置(BIN_DIR
)。Windows用戶還需要將相關的SDL2.dll復制到他們的安裝目錄中,以便可執行文件可以找到它。確保根據所構建的文件復制適當的32位或64位dll。
第0課結束
當我們增加更多的節目在整個課程系列,你可以簡單地添加子目錄 add_subdirectory(Lesson#)
,然后重新使用Lesson0的CMakeLists.txt文件,但更換的occurances Lesson0
用Lesson#
。當我們開始添加SDL擴展庫時,我們將不得不添加更多的CMake模塊和鏈接目標,但是設置起來非常簡單。
Visual Studio
現在,我們已經安裝了庫,我們將要創建一個新項目,以包含和鏈接SDL。最后,我們將其保存為模板項目,以便將來我們可以加載模板並開始工作。首先,我們需要一個新的空C ++項目。
設置包含路徑
我們需要添加SDL include目錄,以便編譯器可以找到SDL標頭。由於我們還希望這些配置在“調試”和“發布”模式下相同,因此請確保在“ 配置”菜單上選擇“ 所有配置 ” 。要設置路徑,請打開項目屬性窗口,然后打開C / C ++部分。在“ 常規” 頁面中,您將找到一個標題為“ 其他包含目錄 ”的條目,單擊此框,然后通過框右側的向下箭頭打開編輯面板。
在此窗口中添加一個新文件夾,然后導航到SDL包含目錄。如果您將SDL開發文件放在“ C:\
包含目錄”面板下,則在正確選擇了“包含”目錄后,將顯示以下內容。
設置庫路徑
要添加庫路徑和鏈接器依賴項,請轉到“ 鏈接器設置”部分,然后打開“ 常規”頁面。要添加庫路徑,請選擇其他庫目錄, 然后添加庫路徑,選擇庫的32位(x86)或64位(x64)版本。在本教程系列中,我選擇使用32位版本。設置路徑后,如果SDL在下面,C:\
並且您選擇了32位庫,則您的輸入應如下所示。
添加庫依賴
現在,我們將庫本身添加為依賴項。切換到“ 輸入”頁面,然后打開“ 附加依賴項”條目的編輯面板並添加SDL2.lib; SDL2main.lib
。完成此操作后,“輸入”頁面應如下所示:
選擇子系統
最后一步是選擇Subsystem目標。為此,請打開“ 系統”頁面,然后從下拉菜單中選擇“控制台”或“ Windows”。如果您選擇Windows,則不會顯示帶有stdout的控制台窗口,如果您選擇Console,則將打開。在這些教程中,由於我將調試消息和錯誤信息寫入stdout以獲得更快/更好的反饋,因此我選擇了Console。如果您還有其他文件記錄要使用並且不想打開控制台,則應該選擇Windows。分發應用程序時,請確保選擇Windows,這樣您的用戶就不會彈出控制台窗口!
測試程序
我們正在為本課程構建的程序是對SDL的簡單健全性檢查。它將 初始化 SDL視頻子系統,檢查是否有 錯誤,然后退出。在運行此程序之前,我們需要將SDL二進制文件復制到可執行文件的目錄中。SDL2.dll
可以在lib /(x86 / x64)下的SDL文件夾的lib目錄中找到,對於鏈接到的體系結構請使用一個。
#include <iostream> #include <SDL.h> int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; }
該程序應該可以成功運行,但是如果您正確配置了所有內容,則什么也不會發生。如果發生錯誤,請確保已正確執行所有步驟。
導出模板項目
為了避免每次我們要創建SDL項目時都必須進行此設置,我們可以將其另存為模板,然后只需從新項目菜單中選擇它即可。為此,請從“ 文件”菜單中選擇“ 導出模板”,然后根據需要配置模板。完成此操作后,項目模板將在Visual C ++項目選擇頁面下可用。
MinGW
為了使用mingw構建項目,我們將使用輕量級的makefile,該文件將設置include和library路徑以及為我們鏈接依賴項。Makefile假定您已將SDL mingw開發庫放置在下面C:/SDL2-2.0.0-mingw/
,並且您正在使用mingw的32位版本和32bit庫。您應該更改它以匹配您的編譯器(32/64位)和SDL文件夾的位置。要將makew文件與mingw一起使用,請mingw32-make.exe
在包含該makefile的文件夾中調用 。
如果您不熟悉Makefile,可以在這里找到基本介紹。
生成文件
CXX = g++ # Update these paths as necessary to match your installation SDL_LIB = -LC:/SDL2-2.0.0-mingw/i686-w64-mingw32/lib -lSDL2main -lSDL2 SDL_INCLUDE = -IC:/SDL2-2.0.0-mingw/i686-w64-mingw32/include # If your compiler is a bit older you may need to change -std=c++11 to -std=c++0x CXXFLAGS = -Wall -c -std=c++11 $(SDL_INCLUDE) LDFLAGS = -lmingw32 -mwindows -mconsole $(SDL_LIB) EXE = SDL_Lesson0.exe all: $(EXE) $(EXE): main.o $(CXX) $< $(LDFLAGS) -o $@ main.o: main.cpp $(CXX) $(CXXFLAGS) $< -o $@ clean: del *.o && del $(EXE)
此makefile配置為在窗口旁邊的控制台中構建項目,因為我們將編寫錯誤並將調試輸出調試到stdout。如果您想使用更好的文件記錄方法或分發程序而又沒有打開控制台,則需要-mconsole
從鏈接器標志中刪除控制台標志()。
測試程序
我們正在為本課程構建的程序是對SDL的簡單健全性檢查。它將 初始化 SDL視頻子系統,檢查是否有 錯誤,然后退出。源文件應該標題為main.cpp
,或者您可以在makefile中更改main.o構建依賴項以匹配您的源文件。在運行此程序之前,我們需要將SDL二進制文件復制到可執行文件的目錄中。可以在mingw文件夾的bin目錄中找到SDL2.dll,對於所編譯的體系結構(32/64位),應使用SDL2.dll。
#include <iostream> #include <SDL2/SDL.h> int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; }
該程序應該可以成功運行,但是如果您正確配置了所有內容,則什么也不會發生。如果發生錯誤,請確保已正確執行所有設置步驟。
Linux命令行
為了在Linux上構建項目,我們將使用一個簡單的makefile,它將為我們設置include和library依賴項。生成文件假定您的SDL庫安裝在下/usr/local/lib
,而標頭位於下/usr/local/include
。如果您是通過cmake構建項目的,則這些是安裝位置,有關從源代碼構建的更多詳細信息,請參見此處。如果您是通過軟件包管理器安裝的,或者將庫和頭文件放在其他位置,則可能需要更改這些路徑以匹配您的安裝。假設您尚未移動安裝,也可以sdl2-config
使用--cflags
和--libs
開關檢查輸出,以找到安裝位置。
如果您不熟悉Makefile,可以在這里找到基本介紹。
生成文件
CXX = g++ # Update these paths to match your installation # You may also need to update the linker option rpath, which sets where to look for # the SDL2 libraries at runtime to match your install SDL_LIB = -L/usr/local/lib -lSDL2 -Wl,-rpath=/usr/local/lib SDL_INCLUDE = -I/usr/local/include # You may need to change -std=c++11 to -std=c++0x if your compiler is a bit older CXXFLAGS = -Wall -c -std=c++11 $(SDL_INCLUDE) LDFLAGS = $(SDL_LIB) EXE = SDL_Lesson0 all: $(EXE) $(EXE): main.o $(CXX) $< $(LDFLAGS) -o $@ main.o: main.cpp $(CXX) $(CXXFLAGS) $< -o $@ clean: rm *.o && rm $(EXE)
測試程序
我們正在為本課程構建的程序是對SDL的簡單健全性檢查。它將 初始化 SDL視頻子系統,檢查是否有 錯誤,然后退出。源文件應該標題為main.cpp
,或者您可以在makefile中更改main.o構建依賴項以匹配您的源文件。
#include <iostream> #include <SDL2/SDL.h> /* * Lesson 0: Test to make sure SDL is setup properly */ int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; }
該程序應該可以成功運行,但是如果您正確配置了所有內容,則什么也不會發生。如果發生錯誤,請確保已正確執行所有設置步驟。
Mac命令行
為了在OS X上構建項目,我們將使用一個簡單的makefile,其中將包含我們的框架。生成文件假定您已按照SDL2下載頁面上的.dmg文件中的說明安裝了SDL,現在可以將其作為框架使用。
如果您不熟悉Makefile,可以在這里找到基本介紹。
生成文件
CXX = clang++ SDL = -framework SDL2 # If your compiler is a bit older you may need to change -std=c++11 to -std=c++0x CXXFLAGS = -Wall -c -std=c++11 LDFLAGS = $(SDL) EXE = SDL_Lesson0 all: $(EXE) $(EXE): main.o $(CXX) $(LDFLAGS) $< -o $@ main.o: main.cpp $(CXX) $(CXXFLAGS) $< -o $@ clean: rm *.o && rm $(EXE)
測試程序
我們正在為本課程構建的程序是對SDL的簡單健全性檢查。它將 初始化 SDL視頻子系統,檢查是否有 錯誤,然后退出。源文件應該標題為main.cpp
,或者您可以在makefile中更改main.o構建依賴項以匹配您的源文件。
#include <iostream> #include <SDL2/SDL.h> /* * Lesson 0: Test to make sure SDL is setup properly */ int main(int, char**){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Quit(); return 0; }
該程序應該可以成功運行,但是如果您正確配置了所有內容,則什么也不會發生。如果發生錯誤,請確保已正確執行所有設置步驟。
在繼續第1課之前,請不要忘記閱讀后記0:正確查找資源路徑,以了解如何找到程序所需資產的位置。