設置SDL編譯環境


第一步是在系統上安裝SDL2開發庫,您可以從SDL2下載頁面下載它們

C ++ 11注意

由於C ++ 11提供了許多我想使用的強大新功能,因此您需要一個支持新標准的編譯器。如今,在Visual Studio 2013及更高版本中,任何現代編譯器都兼容(或對我們而言足夠接近),包括gcc,clang和msvc。使用clang和gcc時,請確保包含C ++ 11標志-std=c++11,或者如果您的編譯器較舊,請確保 -std=c++0xVisual 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 Lesson0Lesson#當我們開始添加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:正確查找資源路徑,以了解如何找到程序所需資產的位置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM