介绍
如果您将SFML与Visual Studio IDE(Visual C++编译器)一起使用,那么本教程是您应该阅读的第一本教程。它将解释如何配置您的SFML项目。
安装SFML
首先,您必须从下载页面下载SFML SDK。
您必须下载与您的Visual C++版本相匹配的程序包。事实上,使用VC++10(Visual Studio 2010)编译的库将与VC++12(Visual Studio 2013)不兼容。如果没有为您的Visual C++版本编译的SFML包,您将不得不自己构建SFML。
然后,您可以随意解压缩SFML归档文件。不建议将头和库复制到Visual Studio的安装中,最好将库保存在各自独立的位置,特别是如果您打算使用同一库的多个版本或多个编译器。
创建和配置SFML项目
首先要做的是选择创建什么样的项目。建议选择“空项目”。对话框窗口提供了一些其他选项来自定义项目:只有当您知道如何使用预编译的标头时,才能选择“控制台应用程序”或“Windows应用程序”。
出于本教程的目的,您应该创建一个main.cpp文件并将其添加到项目中,这样我们就可以访问C++设置(否则Visual Studio不知道您将为此项目使用哪种语言)。我们稍后会解释放什么进去。
现在,我们需要告诉编译器在哪里可以找到SFML头(.hpp文件),以及链接器在哪里可以查找SFML库(.lib文件)。
在项目的属性中,添加:
-
SFML标头的路径
(<sfml-install-path>/include)
到C/C++»常规»附加包含目录 -
SFML库的路径
(<sfml-install-path>/lib)
到链接器»常规»附加库目录
下一步是将应用程序链接到代码所需的SFML库(.lib文件)。SFML由5个模块(系统、窗口、图形、网络和音频)组成,每个模块都有一个库。
库必须添加到项目的属性中,位于;链接器»输入»附加依赖项中。添加所需的所有SFML库,例如“SFML graphics.lib”、“SFML window.lib”和“SFML system.lib”。
链接到与配置匹配的库非常重要:“sfml-xxx-d.lib”表示调试,“sfmlxxx.lib”代表发布。错误的组合可能导致崩溃。
此处显示的设置将导致您的应用程序链接到SFML的动态版本,即需要DLL文件的版本。如果您想去掉这些DLL并将SFML直接集成到可执行文件中,则必须链接到静态版本。静态SFML库的后缀为“-s”:“SFML-xxx-s-d.lib”表示调试,“SFML.xxx-s.lib”用于发布。
在这种情况下,您还需要在项目的预处理器选项中定义SFML_STATIC宏。
从SFML 2.2开始,当进行静态链接时,您还必须将SFML的所有依赖项链接到您的项目。这意味着,例如,如果您正在链接sfml-window-s.lib或sfml-windows s-d.lib,您还必须链接opengl32.lib、winmm.lib和gdi32.lib。其中一些依赖库可能已经列在“继承的值”下,但您自己再次添加它们不会造成任何问题。
以下是每个模块的依赖项,如果您想链接SFML调试库,请如上所述附加-d:
Module | Dependencies |
---|---|
sfml-graphics-s.lib | sfml-window-s.lib sfml-system-s.lib opengl32.lib freetype.lib |
sfml-window-s.lib | sfml-system-s.lib opengl32.lib winmm.lib gdi32.lib |
sfml-audio-s.lib | sfml-system-s.lib openal32.lib flac.lib vorbisenc.lib vorbisfile.lib vorbis.lib ogg.lib |
sfml-network-s.lib | sfml-system-s.lib ws2_32.lib |
sfml-system-s.lib | winmm.lib |
您可能已经从表中注意到,SFML模块也可以相互依赖,例如SFML-graphics-s.lib同时依赖于SFML-window-s.lib和SFML-system-s.lib。如果你静态链接到一个SFML库,确保链接到该库的依赖项,以及依赖项的依赖项等等。如果依赖链上缺少任何东西,您将得到链接器错误。
如果您感到有些困惑,不用担心,对初学者来说,对静态链接的所有这些信息感到不知所措是完全正常的。如果第一次尝试时有些问题,您可以不断尝试,始终牢记上面所说的内容。如果您仍无法使静态链接正常工作,可以查看常见问题解答和论坛中关于静态链接的主题帖。
如果你不知道动态库(也称为共享库)和静态库之间的区别,也不知道该使用哪一个,你可以在互联网上搜索更多信息。有很多关于他们的好文章/博客/帖子。
你的项目已经准备好了,让我们现在写一些代码来确保它能正常工作。将以下代码放入main.cpp文件中:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
如果您选择创建“Windows应用程序”项目,则代码的入口点必须设置为“WinMain”,而不是“main”。由于它是Windows特定的,因此您的代码将无法在Linux或macOS上编译,因此SFML提供了一种方法在这种情况下保持标准的“main”入口点:将您的项目链接到sfml-main模块(在调试版本中为“sfml-main-d.lib”,在发布版本中为“sfml-main.lib”),就像链接sfml-graphics、sfml-window和sfml-system一样。
现在编译项目,如果链接到SFML的动态版本,请不要忘记将SFML DLL(它们位于<sfml安装路径/bin>)复制到编译后的可执行文件所在的目录中。运行它,如果一切正常,您应该看到这个:
如果您正在使用 sfml-audio 模块(无论是静态还是动态),您还必须复制它所需的外部库的 DLL,即 OpenAL32.dll。这些文件也可以在 <sfml-install-path/bin> 中找到。