如何将SFML游戏服务器部署到Linux服务器?

Ale*_*tto 5 c++ linux gcc sfml

我写了一个迷你客户端 - 服务器游戏,在我的计算机上运行正常(运行linux),因为我在客户端和服务器上安装了SFML(和GCC 4.8).现在我想将服务器应用程序部署到另一个没有SFML的Linux上.

首先,我尝试动态链接使用的SFML库(网络和系统):

g++ server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network -lsfml-system
Run Code Online (Sandbox Code Playgroud)

但是,当我运行Server应用程序时,它说它无法找到sfml-network.so.2和sfml-system.so.2,即使这两个文件位于二进制文件的同一文件夹中.

然后我静态链接两个库:

g++ -DSFML_STATIC server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network-s -lsfml-system-s
Run Code Online (Sandbox Code Playgroud)

然后当我运行它说它找不到GLIBC_2.15和GLIBC_2.17

最后在我的最后一次尝试中我将libstc ++和libgcc静态链接:

g++ -DSFML_STATIC server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network-s -lsfml-system-s -static-libstdc++ -static-libgcc
Run Code Online (Sandbox Code Playgroud)

但我仍然得到相同的错误(找不到GLIBC_2.15和GLIBC_2.17).

阅读类似的问题似乎永远不应该静态链接glibc.但我不知道如何继续,如何将我的迷你游戏服务器部署到没有SFML的Linux机器上?

Luk*_*kas 2

Linux 系统通过利用环境变量来搜索共享库LD_LIBRARY_PATH,并且不会像 Windows 上那样自动查找应用程序旁边的二进制文件。使用共享库进行部署的一种非常常用的方法是将它们包含在子目录或类似目录中,而不是直接启动应用程序,运行 shell 脚本,将包含库的目录临时添加到“LD_LIBRARY_PTH”,然后启动应用。

您遇到的另一个问题与依赖关系有关。

对于共享库,您不仅需要提供共享 SFML 库,还需要提供依赖项的共享库,除非您可以 100% 保证目标系统将具有相同的库版本。

如果您只是构建 SFML 的静态库,它们仍然会指向共享运行时库等,因此,如果您没有为应用程序提供匹配的版本,它将无法启动,因为它找不到该库。如果您静态链接到运行时库,则不需要为应用程序提供共享库,但由于 SFML 库仍然动态链接到运行时库,因此它们无论如何都会请求共享库。

因此,如果您不再需要任何共享库文件,则需要将 SFML 静态链接到运行时库(取消选中BUILD_SHARED_LIBS并选中SFML_USE_STATIC_STD_LIBS)。

请记住,静态链接时,您需要针对所有依赖项进行静态链接 --static可能很有用。