介绍
诚然,本教程的标题有点误导。您不会使用CMake编译SFML,因为CMake不是编译器。那么…什么是CMake?
CMake是一个开源的元构建系统。它不构建SFML,它构建的是构建SFML的东西:Visual Studio解决方案、Code::Blocks项目、Linux makefile文件、XCode项目等。事实上,它可以为您选择的任何操作系统和编译器生成makefile文件或项目。对于那些已经熟悉这些工具的人来说,它类似于autoconf/automake或premake。
CMake被许多项目使用,包括Blender、CLion、KDE、Ogre等知名项目。你可以在其官方网站或维基百科文章中阅读更多关于CMake的信息。
正如您所料,本教程分为两个主要部分:使用CMake生成构建配置,以及使用该构建配置使用工具链构建SFML。
安装依赖项
SFML依赖于其他一些库,因此在开始配置之前,您必须安装它们的开发文件。
在Windows和macOS上,所有必需的依赖项都与SFML一起提供,因此您不必下载/安装任何其他内容。建筑将开箱即用。
然而,在Linux上,什么都没有提供。SFML依赖于您自己安装它的所有依赖项。以下是在构建SFML之前需要安装的内容列表:
- freetype
- x11
- xrandr
- udev
- opengl
- flac
- ogg
- vorbis
- vorbisenc
- vorbisfile
- openal
- pthread
安装包的确切名称可能因发行版而异。一旦安装了这些包,不要忘记安装它们的开发头文件。
配置你的SFML构建
此步骤包括创建将最终编译SFML的项目/Makefile。基本上,它涉及选择要构建什么、如何构建以及要在哪里构建。还有几个其他选项,允许您创建适合您需求的构建配置。我们稍后将详细看到这一点。
首先要选择的是项目/Makefile和对象文件(编译过程的结果文件)将被创建的位置。您可以直接在源目录树(即SFML根目录)中生成它们,但是这将会导致一大堆垃圾,如完整的构建文件、对象文件等等。最干净的解决方案是在完全分离的文件夹中生成它们,以便您可以保持SFML目录的清洁。使用单独的文件夹还将使您更容易拥有多个不同的构建(静态、动态、调试、发布等)。
现在,您选择了构建目录,还有一件事要在运行CMake之前完成。当CMake配置项目时,它会测试编译器的可用性(并检查其版本)。因此,在运行CMake时,编译器可执行文件必须可用。对于Linux和macOS用户来说,这不是问题,因为编译器安装在标准路径中,并且始终全局可用,但是在Windows上,您可能需要将编译器的目录添加到PATH环境变量中,以便CMake可以自动找到它。当您安装了几个编译器或同一编译器的多个版本时,这一点尤其重要。
在Windows上,如果您想使用GCC(MinGW),可以临时将MinGW\bin目录添加到PATH中,然后从命令行运行CMake:
> set PATH=%PATH%;your_mingw_folder\bin
> cmake -G"MinGW Makefiles" ./build
对于Visual C++,您可以从开始菜单中选择“Visual Studio命令提示符”运行CMake,或者在您打开的控制台中运行Visual Studio安装中的vcvars32.bat批处理文件。该批处理文件将在该控制台窗口中为您设置所有必要的环境变量。
> your_visual_studio_folder\VC\bin\vcvars32.bat
> cmake -G"NMake Makefiles" ./build
现在您已经准备好运行CMake了。实际上有三种不同的运行它的方式:
-
cmake-gui 这是CMake的图形界面,可以通过按钮和文本字段来配置所有内容。它非常方便,可以轻松查看和编辑构建选项,对于初学者和不想处理命令行的人来说可能是最容易的解决方案。
-
cmake 这是直接调用CMake的方式。如果使用此方法,必须将所有选项名称及其值作为命令行参数进行指定。要打印所有选项的列表,请运行 cmake -L。
在本教程中,我们将使用cmake-gui,因为这是大多数初学者可能会使用的方法。我们假设使用命令行变体的人可以参考CMake文档了解其使用方法。除了截图和点击按钮的说明之外,下面解释的所有内容也同样适用于命令行变体(选项相同)。
以下是CMake GUI的外观:

需要执行的第一步如下(按顺序执行):
- 告诉CMake SFML的源代码在哪里(这必须是SFML文件夹层次结构的根文件夹,基本上是最高级CMakeLists.txt文件所在的位置)。
- 选择要生成项目/makefile的位置(如果目录不存在,CMake将创建它)。
- 单击“配置”按钮。
如果这是第一次在该目录中运行CMake(或者如果清除了缓存),CMake GUI将提示您选择生成器。换句话说,这就是您选择编译器/IDE的地方。

例如,如果您正在使用Visual Studio 2010,则应从下拉列表中选择“Visual Studio 10 2010”。要在Visual Studio命令行上生成可与NMake一起使用的生成文件,请选择“NMake makefiles”。要创建可用于MinGW(GCC)的生成文件,请选择“MinGW生成文件”。使用makefile而不是IDE项目构建SFML通常更容易:您可以用一个命令构建整个库,甚至可以在一个脚本中批处理多个构建。既然您只计划构建SFML而不编辑其源文件,因此IDE项目就没有那么有用了。
安装过程(下面将进一步描述)可能不适用于“Xcode”生成器。因此,强烈建议在macOS上构建时使用Makefile生成器。
始终保持“使用默认本地编译器”选项启用。其他三个字段可以不必管它。
选择生成器后,CMake会运行一系列测试,收集有关您的工具链环境的信息:编译器路径,标准头文件,SFML依赖项等等。如果测试成功,则应该会显示“配置完成”消息。如果出现问题,请仔细阅读输出日志中打印的错误信息。可能会出现编译器无法访问(见上文)或配置不正确,或者SFML的某个外部依赖项缺失的情况。

配置完成后,构建选项会出现在窗口中央。CMake本身有许多选项,但大多数默认情况下已设置为正确的值。其中一些是缓存变量,最好不要更改它们,它们只是提供有关CMake自动发现的反馈。
以下是在配置SFML构建时可能想要查看的几个选项:
| 变量 | 含义 |
|---|---|
| CMAKE_BUILD_TYPE | 此选项选择构建配置类型。有效值为“Debug”和“Release”(还有其他类型,如“RelWithDebInfo”或“MinSizeRel”,但它们是为更高级的构建而设计的)。请注意,如果您为支持多个配置的IDE(如Visual Studio)生成工作区,则会忽略此选项,因为工作区可以同时包含多个配置。 |
| CMAKE_INSTALL_PREFIX | 这是安装路径。默认情况下,它设置为操作系统上最典型的安装路径(对于Linux和macOS是“/usr/local”,对于Windows是“C:\Program Files”等)。在macOS上构建框架时,您可能需要将值更改为“/Library/Frameworks”。在构建后安装SFML并不是强制性的,因为您可以直接从构建位置使用二进制文件。然而,更好的解决方法可能是正确安装它们,以便您可以删除构建过程中产生的所有临时文件。 |
| SFML_DEPENDENCIES_INSTALL_PREFIX | 这是SFML的依赖项(如Freetype和OpenAL)安装的路径。默认情况下,它与CMAKE_INSTALL_PREFIX相同,但在macOS上默认为“/Library/Frameworks”,因为macOS上的依赖关系是作为框架提供的。如上所述,对于CMAKE_INSTALL_PREFIX,构建后安装SFML并不是强制性的,但肯定更干净。 |
| SFML_MISC_INSTALL_PREFIX | 这是SFML示例、文档、许可证和readme文件安装的路径。在Windows上,默认为CMAKE_INSTALL_PREFIX,在FreeBSD、Linux上默认为CMAKE_INSTALL_PREFIX/share/SFML。在macOS上,默认为“/usr/local/share/SFML”。 |
| BUILD_SHARED_LIBS | 这个布尔选项控制是否将SFML构建为动态(共享)库或静态库。 不应同时启用此选项和SFML_USE_STATIC_STD_LIBS,它们是互斥的。 |
| SFML_BUILD_FRAMEWORKS(macOS only) | 这个布尔选项控制是否将SFML构建为framework包或dylib二进制文件。构建framework需要选择BUILD_SHARED_LIBS。 建议在发布应用程序时使用SFML作为framework。然而,请注意,SFML无法在调试配置中构建为framework。在这种情况下,使用dylibs代替。 |
| SFML_BUILD_EXAMPLES | 这个布尔选项控制是否同时构建SFML示例和库。 |
| SFML_BUILD_DOC | 这个布尔选项控制是否生成SFML文档。请注意,必须安装和使用Doxygen工具,否则启用此选项将会产生错误。 在macOS上,您可以将经典的Unix doxygen二进制文件安装到 /usr/bin 或任何类似的目录中,或者将Doxygen.app安装到任何“应用程序”文件夹中,例如~/Applications。 |
| SFML_BUILD_AUDIO | 这个布尔选项控制是否构建SFML音频模块。 |
| SFML_BUILD_GRAPHICS | 这个布尔选项控制是否构建SFML图形模块。 |
| SFML_BUILD_WINDOW | 这个布尔选项控制是否构建SFML窗口模块。 |
| SFML_BUILD_NETWORK | 这个布尔选项控制是否构建SFML网络模块。 |
| SFML_USE_SYSTEM_DEPS | 这个布尔选项控制是使用 extlibs 目录中的依赖项还是使用系统依赖项。 无论选项如何,extlibs目录中的 stb_image_* 头文件都会被使用。 |
| SFML_USE_STATIC_STD_LIBS(Windows only) | 这个布尔选项选择连接到SFML的C/C++运行时库的类型。 为 TRUE 时,标准库会被静态链接,这意味着SFML是自包含的,不依赖于编译器特定的DLL。 为 FALSE(默认值)时,标准库会被动态链接,这意味着SFML依赖于编译器的DLL(对于Visual C++是msvcrxx.dll/msvcpxx.dll,对于GCC是libgcc_s_xxx-1.dll/libstdc+±6.dll)。设置时要小心。设置必须与您自己项目的设置匹配,否则您的应用程序可能无法运行。 此选项不应与 BUILD_SHARED_LIBS 同时启用,它们是互斥的。 |
| SFML_GENERATE_PDB(Visual Studio only) | 这个布尔选项控制Visual Studio是否应该生成 PDB 文件,这些文件是包含调试SFML所需的调试符号的单独文件。 |
| CMAKE_OSX_ARCHITECTURES(macOS only) | 这个布尔选项定义了SFML应该编译的架构。 建议的值是"x86_64",因为不支持32位编译。 |
| SFML_INSTALL_XCODE_TEMPLATES(macOS only) | 这个布尔选项控制CMake是否将安装Xcode模板在你的系统上。请确保/Library/Developer/Xcode/Templates/SFML存在并且可写。有关这些模板的更多信息可以在macOS的“入门指南”中找到。 |
| SFML_INSTALL_PKGCONFIG_FILES(Linux shared libraries only) | 这个布尔选项控制CMake是否将安装pkg-config文件在你的系统上。pkg-config是一个提供查询已安装库的统一接口的工具。 |
配置完成后,再次点击“Configure”按钮。不应该再有任何选项被标为红色,而且“Generate”按钮也应该被启用。点击它来生成所选择的Makefiles/项目。

CMake为每个项目创建一个变量缓存。因此,如果您决定稍后重新配置某些内容,您会发现您的设置已从上次配置中保存。进行必要的更改,重新配置并生成更新后的Makefiles/项目。
编译SFML
让我们从好消息开始这个部分:即使您更新了SFML的工作副本,您也不必再进行配置步骤。 CMake很聪明:它为生成的makefile/项目添加了一个自定义步骤,以在发生更改时自动重新生成构建文件。
现在,您可以开始构建SFML了。当然,如何构建取决于您生成了什么makefile/项目。如果您创建了一个项目/解决方案/工作区,请使用您的IDE打开它,并像构建任何其他项目一样构建SFML。我们不会在这里详细介绍,因为有太多不同的IDE,我们必须假设您足够熟练,能够自行执行此简单任务。
如果您生成了一个makefile,请打开命令行窗口并执行与您的环境相对应的make命令。例如,如果您生成了一个NMake(Visual Studio)makefile,则运行“nmake”,如果您生成了一个MinGW(GCC)makefile,则运行“mingw32-make”,如果您生成了一个Linux makefile,则只需运行“make”。 注意:在Windows上,make程序(nmake或mingw32-make)可能无法访问。如果是这种情况,请不要忘记将其位置添加到您的PATH环境变量中。有关更多详细信息,请参阅“配置您的SFML构建”部分开头的说明。
默认情况下,构建项目将构建所有内容(所有SFML库以及所有示例(如果启用了SFML_BUILD_EXAMPLES选项))。如果您只想构建特定的SFML库或示例,则可以选择不同的目标。您还可以选择使用相应的目标清除或安装构建文件。 以下是所有可用的目标,取决于您选择的配置选项:
| 目标 | 含义 |
|---|---|
| all | 这是默认目标,如果没有明确指定目标,则使用它。它构建所有生成二进制文件的目标(SFML库和示例)。 |
| sfml-system sfml-window sfml-network sfml-graphics sfml-audio sfml-main | 构建相应的SFML库。当构建Windows时,仅“sfml-main”目标可用。 |
| cocoa ftp opengl pong shader sockets sound sound-capture voip window win32 X11 | 构建相应的SFML示例。这些目标仅在启用SFML_BUILD_EXAMPLES选项时可用。请注意,某些目标仅在某些操作系统上可用(“cocoa”在macOS上可用,“win32”在Windows上可用,“X11”在Linux上可用等)。 |
| doc | 生成API文档。仅在启用SFML_BUILD_DOC选项时可用。 |
| clean | 删除先前构建产生的所有目标文件,库和示例二进制文件。通常情况下,您不需要调用此目标,异常情况是当您想完全重建SFML时(某些源更新可能与现有目标文件不兼容,并且清理一切是唯一的解决方案)。 |
| install | 将SFML安装到CMAKE_INSTALL_PREFIX和CMAKE_INSTALL_FRAMEWORK_PREFIX指定的路径中。它复制SFML库和头文件,以及如果启用了SFML_BUILD_EXAMPLES和SFML_BUILD_DOC,则包括示例和文档。安装后,您将获得一个干净的SFML发行版,就好像您已从SDK下载或从发行版的软件包存储库中安装它一样。 |
如果您使用的是集成开发环境(IDE),则一个目标只是一个项目。要构建一个目标,请选择相应的项目并编译它(即使是“clean”和“install”也必须被编译才能执行–不要因为实际上没有编译任何源代码而感到困惑)。
如果您使用的是makefile,请将目标名称传递给make命令以构建目标。例如:“nmake doc”,“mingw32-make install”,“make sfml-network”。
此时,您应该已经成功构建了SFML。恭喜!
4112

被折叠的 条评论
为什么被折叠?



