设置SDL编译环境

第一步是在系统上安装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 Lesson0Lesson#。当我们开始添加SDL扩展库时,我们将不得不添加更多的CMake模块和链接目标,但是设置起来非常简单。

 

Visual Studio

现在,我们已经安装了库,我们将要创建一个新项目,以包含和链接SDL。最后,我们将其保存为模板项目,以便将来我们可以加载模板并开始工作。首先,我们需要一个新的空C ++项目。


设置SDL编译环境

设置包含路径

我们需要添加SDL include目录,以便编译器可以找到SDL标头。由于我们还希望这些配置在“调试”和“发布”模式下相同,因此请确保在“ 配置”菜单上选择“ 所有配置 ” 。要设置路径,请打开项目属性窗口,然后打开C / C ++部分。在“ 常规” 页面中,您将找到一个标题为“ 其他包含目录 ”的条目,单击此框,然后通过框右侧的向下箭头打开编辑面板。


设置SDL编译环境

在此窗口中添加一个新文件夹,然后导航到SDL包含目录。如果您将SDL开发文件放在“ C:\包含目录”面板下,则在正确选择了“包含”目录后,将显示以下内容。


设置SDL编译环境

设置库路径

要添加库路径和链接器依赖项,请转到“ 链接器设置”部分,然后打开“ 常规”页面。要添加库路径,请选择其他库目录, 然后添加库路径,选择库的32位(x86)或64位(x64)版本。在本教程系列中,我选择使用32位版本。设置路径后,如果SDL在下面,C:\并且您选择了32位库,则您的输入应如下所示。


设置SDL编译环境

添加库依赖

现在,我们将库本身添加为依赖项。切换到“ 输入”页面,然后打开“ 附加依赖项”条目的编辑面板并添加SDL2.lib; SDL2main.lib。完成此操作后,“输入”页面应如下所示:


设置SDL编译环境

选择子系统

最后一步是选择Subsystem目标。为此,请打开“ 系统”页面,然后从下拉菜单中选择“控制台”或“ Windows”。如果您选择Windows,则不会显示带有stdout的控制台窗口,如果您选择Console,则将打开。在这些教程中,由于我将调试消息和错误信息写入stdout以获得更快/更好的反馈,因此我选择了Console。如果您还有其他文件记录要使用并且不想打开控制台,则应该选择Windows。分发应用程序时,请确保选择Windows,这样您的用户就不会弹出控制台窗口!


设置SDL编译环境

测试程序

我们正在为本课程构建的程序是对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 ++项目选择页面下可用。


设置SDL编译环境

   

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:正确查找资源路径,以了解如何找到程序所需资产的位置。

 

上一篇:Ubuntu移植FFmpeg和SDL2


下一篇:SDL2 游戏开发日记(八) 按钮、对话框的绘制