我写了一个迷你客户端 - 服务器游戏,在我的计算机上运行正常(运行linux),因为我在客户端和服务器上安装了SFML(和GCC 4.8)。现在我想将服务器应用程序部署到另一个没有SFML的Linux上。
首先,我尝试动态链接所使用的SFML库(网络和系统):
g++ server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network -lsfml-system
但是,当我运行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
然后当我运行时说它找不到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机器上?
答案 0 :(得分:2)
Linux系统利用LD_LIBRARY_PATH
环境变量搜索共享库,它们不会自动查找应用程序旁边的二进制文件,就像Windows上的情况一样。
一个经常使用的使用共享库进行部署的方法是将它们包含在子目录或类似目录中,而不是直接启动应用程序运行一个shell脚本,该脚本会将带有库的目录临时添加到?LD_LIBRARY_PTH`然后启动应用
您遇到的另一个问题与依赖关系有关。
对于共享库,您不仅需要提供共享的SFML库,还需要提供依赖项的共享库,除非您可以100%保证目标系统具有相同的库版本。
如果您只是构建SFML的静态库,它们仍然会指向共享的运行时库等,因此如果您不为应用程序提供匹配的版本,它将无法启动,因为它不能找到图书馆。 如果静态链接运行时库,则不需要为应用程序提供共享库,但由于SFML库仍然是动态链接到运行时库,因此它们仍然会请求共享库。 / p>
因此,如果您不再需要任何共享库文件,则需要静态链接SFML与运行时库(取消选中BUILD_SHARED_LIBS
并检查SFML_USE_STATIC_STD_LIBS
)。
请注意,在静态链接时,您需要静态链接所有依赖项 - -static
可能有用。