2014-01-14 150 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內核函數的警告,但它在部署的服務器上完美運行) –