2011-05-08 41 views
2

我有一個跨平臺的應用程序(遊戲)。它使用SDL庫。由於LGPL許可證,我無法靜態鏈接它。在Windows上捆綁DLL文件,在Mac OSX I捆綁Frameworks目錄。但是如何在GNU/Linux上解決呢?如果用戶已經安裝了系統上沒有SDL庫有一個錯誤:部署Linux遊戲,共享庫/依賴關係

error while loading shared libraries: libSDL-1.2.so.0: cannot open shared object file: No such file or directory

即使我捆綁.so文件,系統似乎並不使用它。

另一個問題是我不想強制覆蓋用戶庫。 SDL不是問題,但是例如OpenAL庫差別很大,用戶可以使用OpenAL庫,而我的機器可能會崩潰。

+0

你在哪裏放置'.so'文件?系統只會在搜索路徑中找到它們。 – 2011-05-08 21:01:54

+0

與可執行文件位於同一目錄中。我不想將任何東西安裝到系統路徑中,因爲我不想要求root訪問權限。 – John 2011-05-08 21:02:48

回答

6

默認情況下,Linux不搜索當前目錄,也不搜索運行二進制文件的目錄。如果你想簡單的方法,這樣做:

$> LD_PRELOAD=/path/to/your.so programName 

正確的做法是設置LD_LIBRARY_PATH環境變量,它的搜索路徑冒號分隔列表。將庫的路徑添加到此列表中。

$> export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/your/libs" 
$> programName 

如果你真的想要得到的創意,你的二進制實際上如果配置得當包含它自己的搜索路徑:

http://www.eyrie.org/~eagle/notes/rpath.html

1

這個解決方案取決於你使用什麼Linux發行版(更具體什麼包管理器),但我認爲這是「最乾淨」解決問題的方法:

創建包含應用程序包(在Ubuntu或Debian,這將是一個與apt一起使用的.deb軟件包)。這樣你可以設置對共享庫的依賴。您不必自己部署SDL/OpenAL,如果這些軟件包以新版本發佈,則不必更新自己的軟件包。這樣,您的應用程序將更小並且更容易分發,並且如果目標系統上不存在SDL/OpenAL,它們將被安裝。缺點是你的應用程序不是獨立的。

+0

這實際上是非常明智的答案。雖然我不想承擔任何特定的發行版,但不僅僅是壓縮二進制文件,還有.deb軟件包對Ubuntu/Debian用戶非常有用 - 我認爲這些發行版是最流行的版本之一。 – John 2011-05-14 13:53:10

+1

@John:我建議查看關於如何做到這一點的Ubuntu資源:[link](https://wiki.ubuntu.com/PackagingGuide)。這是相當讀的,但它的一些部分可以被簡化(例如使用CDBS來設置規則)。一些使CMake或[qmake](https://wiki.ubuntu.com/PackagingGuide/QtApplication)等系統具有其他工具,可以使此過程更輕鬆。使用pbuilder創建.deb包也是一個好主意。通過這種方式,您可以確保該軟件包可以在另一個系統上工作(所有依賴關係都在.deb中正確定義) – Orka 2011-05-14 15:07:38