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