2013-08-29 77 views
1

我正在編寫一個共享庫,我正在Windows,Linux和Mac下部署。在Linux方面,我試圖確保我的庫具有儘可能少的依賴關係。我不希望最終開發者不得不擔心我的庫在內部使用什麼,特別是我不想強迫他們安裝任何東西。最小化Linux共享庫的依賴關係

當我在此刻運行在我的圖書館LDD,我看到:

linux-gate.so.1 => (0xf57fe000)           
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb773d000)  
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7654000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74a1000)     
    /lib/ld-linux.so.2 (0xb7782000)           
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb745d000)     
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7440000)   

這看起來相當合理的,我的,但一些圖書館的我真的不知道它們是什麼。任何人都可以告訴我,這個依賴關係列表是否合理,還是我可以擺脫其中的一些?有了這個依賴列表,我的庫可以運行在各種Linux配置和發行版上嗎?這是我的目標,最大的便攜性。

編譯時,我指定了標誌-static-libgcc。例如,是否還有更多的標誌可以指定在C++標準庫中鏈接?在內部,我的庫在C++ 11中使用std :: thread,但我不想強制應用程序編寫者必須具有可用的(如果他們使用的是較舊版本的GCC)。

更新:

我現在指定-static-的libstdC++,除了-static-libgcc中。我的依賴列表現在看起來如下:

linux-gate.so.1 => (0xf57fe000)           
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7737000)  
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)     
    /lib/ld-linux.so.2 (0xb77a2000)           

的,僅僅是引起了我的關注是libc.so.6的,和linux-gate.so.1。我不知道這些是什麼。他們是否老了,如果有的話,他們已經長期向後兼容?如果是這樣,我會保持它們動態鏈接,否則我必須繼續調查。任何提示將不勝感激。

+1

你想要定位哪個linux發行版?我認爲這是一個難以解決的問題。 – trojanfoe

+0

儘可能多。我沒有特別的喜好。我的生成機器是Ubuntu 13,32位。 –

+0

這是非常複雜的。一種選擇是爲您的開發者客戶提供一個靜態庫,但仍然有一些運行時間解決方案可以解決這個問題。 – trojanfoe

回答

1

linux-gate.so.1是一個虛擬的DSO,這意味着它並不存在。解釋它的最好方法就是閱讀這個鏈接Here

要回答你的問題,我認爲你的最佳選擇是繼續動態鏈接到他們兩個,並做一些不同的構建目標不同的發行版。我發現通常在爲Ubuntu構建時,它可以在幾個Debian Linux系統上運行。

+0

謝謝。你能否推薦一些我可以爲其構建的其他發行版,這會間接地對其他發行版起作用?我在這裏有Ubuntu,但有能力虛擬安裝其他人。你能推薦任何能給我帶來最佳覆蓋率的主要產品嗎? –

+1

Fedora(又名紅帽),Ubuntu和Suse的構建會給你很好的覆蓋。許多發行版都基於Debian或紅帽,因此這兩者將會走很長的路。 –

+0

謝謝!非常感激。 –