2014-01-13 63 views
3

我正在編寫一個與圖形一起使用的Python應用程序,並依賴於PySDL2庫。 PySDL2依賴編譯的SDL2二進制庫,可能是downloaded from SDL site。我寫了一個bootstrap script to automate the process,但它僅適用於Windows,因爲沒有用於Linux的二進制下載。用於Linux的便攜式.so庫

現在的問題是如何使Linux的二進制SDL2下載?

目前還不清楚是否可以創建可在所有Linux上運行的.so文件,如果這是因爲無法創建可在每個CPU上運行的.so文件,那主要是因爲它目前尚不清楚這方面是否有工作已經完成(我確信人們試圖研究這個問題),如果是這樣,那麼爲什麼不採用便攜式.so文件格式(針對不同分佈和CPU的跨平臺) 。

更新:我不介意與Linux社區提供的更新和安全修補程序安裝的依賴關係(包),但這應該在用戶空間完成,我需要將其與便攜腳本自動的能力。

+0

@ 0xC0000022L,已修復。 –

回答

3

關於CPU架構,Linux不支持Fat Binaries(比每個二進制架構更多,例如OS X中可用的架構)。 Ryan Gordon有一個叫做Fat ELF的提議,可惜沒有去任何地方。

在SDL2的特定情況下,庫鏈接默認情況下很少庫:

LDD /usr/local/lib/libSDL2.so

linux-vdso.so.1 => (0x00007fffd1f0b000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f414c44e000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f414c24a000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f414c02c000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f414be24000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f414ba5c000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f414cac4000) 

其餘SDL依賴的二進制文件是動態加載的(使用dlopen),SDL非常適合不同版本的某些二進制文件。因此,簡而言之,如果您在某個帶有特定版本的libc,libpthread等的系統中進行編譯,並設法找到具有兼容二進制文件的不同系統,那麼SDL二進制文件至少可以運行。在實踐中,根據系統提供的二進制文件,您最好選擇一個,或者接受您將使用您定製的SDL2來支持一套有限的發行版。

請注意,如果您靜態鏈接SDL,此限制也適用!如果你認爲你可以繼續添加靜態鏈接的二進制文件,直到你創建了幾百個可以運行的megs的靜態球(就像我做的那樣),還有其他的限制阻止你這麼做,從授權問題到段錯誤由於靜態鏈接libpthread。

+0

這很讓人傷心,但我認爲並不比在Windows上的.dll更爲糟糕。我認爲該操作系統上的系統庫是向後兼容的,這對於Linux也是如此,不是嗎?至少我可以嘗試構建這個.so文件,如果它無法啓動,請說 - 「對不起,請嘗試瞭解如何爲您的系統編譯SDL2 + PySDL」。是否有任何其他提示如何提高可移植性百分比?靜態鏈接有幫助嗎? –

+0

我認爲你有兩個主要的選擇是創建一個包(Debian/Ubuntu的.deb包,Fedora的RPM等),並將SDL2列爲依賴項(以及Python 2或3,以及其他任何結束用戶需要安裝)。或者你可以製作一個安裝腳本來下載,編譯和安裝SDL2,如果你使用標準的Pythonic方式(這是PySDL2的功能:https://pypi.python.org/pypi/PySDL2/0.8),甚至會更好。 0) – gabomdq

+0

是否有可能沒有root權限? –

4

不要這樣做。

最可靠的方法是製作一個完整的靜態構建的庫堆棧。

但是這樣會使應用程序膨脹,如果這些庫中存在任何安全問題,您需要自行更新,您的所有用戶都需要重新下載。

使用提供SDL庫的分佈,你的應用將受益於SDL bug修正和更新Linux社區完成。

考慮爲最常見的發行版(即Debian,Ubuntu,Redhat,Fedora)提供軟件包,然後對發行版提供的SDL庫有適當的依賴關係。

當你看看Skype,Google等人如何分發他們的二進制文件時,它總是在特定分發包中,然後可以與系統庫一起工作。例如Skype的:

Depends: libasound2 (>= 1.0.16), libc6 (>= 2.3.6-6~), libc6 (>= 2.7), 
    libgcc1 (>= 1:4.1.1), libqt4-dbus (>= 4:4.5.3), libqt4-network (>= 4:4.8.0), 
    libqt4-xml (>= 4:4.5.3), libqtcore4 (>= 4:4.7.0~beta1), libqtgui4 (>= 4:4.8.0), 
    libqtwebkit4 (>= 2.1.0~2011week13), libstdc++6 (>= 4.6), libx11-6, libxext6, 
    libxss1, libxv1, libssl1.0.0 

正如你所看到的,SKYPE不攜旗下所有庫包括在內。安裝Skype時,用戶可能不得不依靠他的軟件包管理器來解決這些依賴關係。

此外,Linux用戶非常不願意下載或安裝二進制文件。 如果你真的希望人們使用你的「應用程序」,你最好把它開源並讓其他人把它包含在主要的Linux發行版中。 Linux不是Windows。 Linux上很少有病毒的原因之一是因爲大多數人不會下載不可信的軟件。

+0

好的。我怎樣才能在用戶空間做到這一點?當我下載.dll時,我不需要root權限來運行二進制文件,而使用Linux社區構建的軟件包需要root用戶才能運行它。我也不知道如何告訴用戶命令它需要爲他的平臺運行,這會殺死所有的樂趣和破壞體驗。在最終用戶應該下載並運行我的程序 - 不花費10分鐘試圖獲取所有依賴關係..所以我想自動化這一步。 –

+0

是的 - 我的應用程序是開源的 - 它在這裏 - https://bitbucket.org/techtonik/discovery/src/tip/graphics/pysdl2/?at=default =) –

+0

總之,解決方案**是不便攜式**。有沒有辦法讓自己變得更好? –