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

5
我写了一个迷你客户端-服务器游戏,在我的电脑上(运行linux)很好用,因为我在客户端和服务器上都安装了SFML(和GCC 4.8)。现在我想将服务器应用程序部署到另一个没有SFML的Linux上。
首先,我尝试使用动态链接所使用的SFML库(网络和系统):
g++ server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network -lsfml-system

但是当我运行服务器应用程序时,它说找不到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

当我运行时,它提示找不到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

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

阅读类似的问题,似乎应该永远不要静态链接glibc。但我不知道该怎么做,如何将我的小型游戏服务器部署到没有SFML的Linux盒子上?

1个回答

2
Linux系统通过使用LD_LIBRARY_PATH环境变量来搜索共享库,它们不会自动查找应用程序旁边的二进制文件,这在Windows上是这种情况。 部署共享库的一个常用方法是将它们包含在子目录或类似位置中,而不是直接启动应用程序,而是运行一个shell脚本,该脚本将临时将带有库的目录添加到LD_LIBRARY_PTH中,然后启动应用程序。
你遇到的另一个问题与依赖关系有关。 对于共享库,您不仅需要提供共享的SFML库,还需要提供依赖库的共享库,除非您可以百分之百地保证目标系统将具有相同的库版本。
如果您只构建SFML的静态库,它们仍将指向共享运行时库等,因此如果您没有为应用程序提供匹配的版本,它将无法启动,因为找不到库。 如果您针对运行时库进行静态链接,则不需要为您的应用程序提供共享库,但由于SFML库仍然是动态链接的运行时库,它们仍然会请求共享库。
因此,如果您不再想要任何共享库文件,则需要静态链接SFML与运行时库(取消选中BUILD_SHARED_LIBS并选中SFML_USE_STATIC_STD_LIBS)。
请记住,在静态链接时,您需要静态链接所有依赖项- -static可能会有用。

谢谢,我通过你的见解成功地进行了静态编译!-static 命令起到了关键作用!(它会警告 getaddr 内核函数仍在使用共享库,但在服务器上部署时却完美无缺) - Alessandro Stamatto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接