2014-01-14 149 views
5

我写了一个迷你客户端服务器游戏,在我的电脑上运行正常(运行linux),因为我在客户端和服务器上安装了SFML(和GCC 4.8)。现在我想将服务器应用程序部署到另一个没有SFML的Linux。如何将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机器上?

回答

2

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

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

对于共享库,您不仅必须提供共享SFML库,还要提供依赖关系的共享库,除非您能100%保证目标系统具有相同的库版本。

如果你只是建立SFML的静态库,他们仍然会指向共享的运行时库等,因此如果你没有提供与应用程序匹配的版本,它将无法启动,因为它可以'找到图书馆。 如果您与运行时库静态链接,则不需要为您的应用程序提供共享库,但由于SFML库仍与运行时库动态链接,因此它们总是请求共享库。

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

请记住,静态链接时,您需要静态链接所有依赖项 - -static可能会有用。

+0

谢谢,我设法用你的见解进行静态编译! - 静态做到了这一招! (它给出了关于仍然使用共享库的getaddr内核函数的警告,但它在部署的服务器上完美运行) –