我怎样才能与其他人无误地分享我的 SFML 游戏?
How can I share my SFML game with others without errors?
所以,我用 C ++ / SFML 完成了一个游戏,我想将它发送给某人,但是当我发送它时出现错误:我在另一台计算机上测试了需要 SFML DLL 的 exe,它显示了我那个 libstdc ++ - 6.dll 不见了,所以我加了它,我又试了一次,它告诉我还有其他的 dll 不见了,这很尴尬。我如何才能在没有所有这些错误和丢失 DLL 的情况下共享我的游戏?
您应该使用所有编译器 DLL 测试可执行文件。
libstdc++-6.dll 是编译器文件夹中的 DLL 文件。所以你应该用所有编译器的 dll 来测试它。
希望这有效。
您可以使用 Dependency Walker (depends.exe) 来查找您的应用程序正在使用的所有 dll-s。它仍然需要一些反复试验来发现你需要的,但至少你有一个可以开始的地方。您很可能需要编译器提供的 dll 和您正在使用的其他库的 dll。您很可能不需要 System32 文件夹中的任何内容。
如果您计划部署 SFML 应用程序,建议静态构建您的项目。这还需要静态构建 SFML。设置需要一些时间,但所有依赖项都将包含在您的可执行文件中,从而使您的应用程序更加可靠且更易于安装。不要将此过程与静态链接到 SFML 混淆,静态链接到 SFML 后,您仍然需要这样做。
您必须克隆 SFML repository and use CMake to generate your visual studio project,这样您就可以静态构建 SFML,使用 /MTd 进行调试,使用 /MT 进行发布。这些选项可以在 Project Properties > C/C++ > Code Generation > Runtime Library
.
中找到
正如@aj.toulan 所说,您需要Link 静态SFML。我假设您正在使用 Visual Studio 在 Windows 上进行开发。
当您下载并设置 SFML 时,它已经构建了静态库。
如果您使用任何外部库,您需要构建它们的静态版本!
您需要在项目属性中为 SFML_STATIC 添加 pre-processor 定义。
- 转到项目属性
- 转到选项卡 C/C++
- 预处理器
- 在预处理器定义的开头添加 "SFML_STATIC;",然后按 Enter。
- 应用
现在您需要包含静态库。无论您在项目中使用哪个 SFML 库,但添加“-s”
例如#pragma comment(lib,"sfml-graphics-s.lib")
SFML 使用 openal32.lib 并且由于许可,您需要将该 DLL 与您的 exe
放在文件夹中
#ifndef SFML_STATIC
#pragma comment(lib,"sfml-graphics-s.lib")
#pragma comment(lib,"freetype.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"sfml-system-s.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"sfml-window-s.lib")
#pragma comment(lib,"gdi32")
#pragma comment(lib,"winmm")
#pragma comment(lib,"sfml-audio-s.lib")
#pragma comment(lib,"flac.lib")
#pragma comment(lib,"ogg.lib")
#pragma comment(lib,"vorbisenc.lib")
#pragma comment(lib,"vorbisfile.lib")
#pragma comment(lib,"vorbis.lib")
#pragma comment(lib,"openal32.lib")
#pragma comment(lib,"sfml-main.lib")
#pragma comment(lib,"sfml-network-s.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"openal32.lib")
//include below line if you want to hide console window
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#endif // !SFML_STATIC
Link to SFML FAQ showing what you need to include for each lib when linking statically
所以,我用 C ++ / SFML 完成了一个游戏,我想将它发送给某人,但是当我发送它时出现错误:我在另一台计算机上测试了需要 SFML DLL 的 exe,它显示了我那个 libstdc ++ - 6.dll 不见了,所以我加了它,我又试了一次,它告诉我还有其他的 dll 不见了,这很尴尬。我如何才能在没有所有这些错误和丢失 DLL 的情况下共享我的游戏?
您应该使用所有编译器 DLL 测试可执行文件。
libstdc++-6.dll 是编译器文件夹中的 DLL 文件。所以你应该用所有编译器的 dll 来测试它。
希望这有效。
您可以使用 Dependency Walker (depends.exe) 来查找您的应用程序正在使用的所有 dll-s。它仍然需要一些反复试验来发现你需要的,但至少你有一个可以开始的地方。您很可能需要编译器提供的 dll 和您正在使用的其他库的 dll。您很可能不需要 System32 文件夹中的任何内容。
如果您计划部署 SFML 应用程序,建议静态构建您的项目。这还需要静态构建 SFML。设置需要一些时间,但所有依赖项都将包含在您的可执行文件中,从而使您的应用程序更加可靠且更易于安装。不要将此过程与静态链接到 SFML 混淆,静态链接到 SFML 后,您仍然需要这样做。
您必须克隆 SFML repository and use CMake to generate your visual studio project,这样您就可以静态构建 SFML,使用 /MTd 进行调试,使用 /MT 进行发布。这些选项可以在 Project Properties > C/C++ > Code Generation > Runtime Library
.
正如@aj.toulan 所说,您需要Link 静态SFML。我假设您正在使用 Visual Studio 在 Windows 上进行开发。 当您下载并设置 SFML 时,它已经构建了静态库。
如果您使用任何外部库,您需要构建它们的静态版本!
您需要在项目属性中为 SFML_STATIC 添加 pre-processor 定义。
- 转到项目属性
- 转到选项卡 C/C++
- 预处理器
- 在预处理器定义的开头添加 "SFML_STATIC;",然后按 Enter。
- 应用
现在您需要包含静态库。无论您在项目中使用哪个 SFML 库,但添加“-s”
例如#pragma comment(lib,"sfml-graphics-s.lib")
SFML 使用 openal32.lib 并且由于许可,您需要将该 DLL 与您的 exe
放在文件夹中#ifndef SFML_STATIC
#pragma comment(lib,"sfml-graphics-s.lib")
#pragma comment(lib,"freetype.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"sfml-system-s.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"sfml-window-s.lib")
#pragma comment(lib,"gdi32")
#pragma comment(lib,"winmm")
#pragma comment(lib,"sfml-audio-s.lib")
#pragma comment(lib,"flac.lib")
#pragma comment(lib,"ogg.lib")
#pragma comment(lib,"vorbisenc.lib")
#pragma comment(lib,"vorbisfile.lib")
#pragma comment(lib,"vorbis.lib")
#pragma comment(lib,"openal32.lib")
#pragma comment(lib,"sfml-main.lib")
#pragma comment(lib,"sfml-network-s.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"openal32.lib")
//include below line if you want to hide console window
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#endif // !SFML_STATIC
Link to SFML FAQ showing what you need to include for each lib when linking statically