2013-04-27 104 views
10

幫助我解決分數問題。構建多個平臺的Linux二進制文件

我有一個用C++編寫的軟件,它可以在儘可能多的Linux發行版上運行,我需要找出一個有效的策略。我試圖在這種情況下運行二進制文件而不是源代碼(可能很好知道)。 它已經是一個商業產品,我有知識產權問題,阻止我開源產品,但也意味着我必須處理無數的GPL問題。

推理的當前路線是選擇一個最不常見的分母,並且建立一切。這有兩個主要的含義,我覺得反作用。

  1. 舊版GCC中的C++支持缺少一些更新的C++特性。
  2. 最小公分母需要紅帽企業Linux 4(RHEL4)

我絕對不需要整個C++ 11的功能設置,但我想帶來的C++支持到那個Visual C++ 2010.我正在細讀使用Clang/libC++而不是GCC/libstdC++的想法。我對RHEL4不同版本的Linux的ABI的穩定性沒有多少見解,但是我擔心RHEL4比值得的麻煩更麻煩。試圖爲所有基於少數幾個發行版構建並不是一個可行的策略。

我假設編譯用於不同發行版的Linux軟件最好是通過目標平臺上的工具編譯目標平臺的軟件來完成。如果您不接受這一點,我目前也在假設您將跨Linux平臺運行大量可移植性問題。不要談論因爲跨平臺/發行版的C++ ABI不穩定而可以或不能鏈接的許多庫。

但是我可能是錯的,我想聽取定期處理這個問題的人的意見。什麼會起作用,爲什麼?或者更重要的是,哪些不起作用?

+3

如果我正在爲軟件付費如果我在Linux上報告一個很大的問題會發生什麼情況 - 您肯定會支持一個產品,您必須在支持的Linux版本上測試產品 - 因此您必須擁有一個虛擬機爲每一個和建立那裏 – Mark 2013-04-27 11:27:21

+0

@馬克我的想法精確地說,它的工作正在進行中。 – 2013-04-27 11:34:22

+0

http://stackoverflow.com/questions/2157636 | http://stackoverflow.com/questions/16250831 | http://stackoverflow.com/questions/15386027 – 2015-06-04 16:00:07

回答

7

您可以嘗試把重點放在幾個主要的平臺而不是個人分佈。我的意思是建立在我稱之爲「基礎發行版」(Debian和RedHat)的基礎之上,並希望在其他方面取得最佳效果。

很可能,Debian二進制文件(靜態鏈接的)在Ubuntu和Mint以及其他Debian派生的發行版上運行得很好。 RedHat二進制文件可能運行在Centos,Scientific Linux和SuSE Linux上。如果你關心的是不太受歡迎的發行版(假設你有很多客戶運行一些不常見的Linux),並且你的Debian或RedHat可執行文件無法在其上運行,或者可以以某種方式工作,然後設置該發行版的虛擬機並構建一個可執行文件專門爲那種味道。

我在過去採取了這種方法,它運行良好。

+1

但是您推薦爲Debian和RHEL分別使用二進制文件? – 2013-04-27 13:27:20

4

最好的辦法是讓你的軟件開放源碼free software(例如GPLv3 +許可證),那麼如果你的軟件足夠有趣,它將被分發(由分發維護者)打包。

你總是想提供分發包(例如Ubuntu或Debian的.deb文件),因爲這些文件最容易安裝。

如果你仍然想使專有軟件(但問自己,如果你將能夠出售,甚至分發免費,成功軟件),你可以採取以下步驟:

  • 通過啓用一個靜態stdC++ &靜態libgcc(大多數發行版提供的GCC不這樣做)來編譯最近的GCC編譯器(例如4.8)。

  • 可能靜態鏈接您的程序(但您可能無法執行此操作,例如​​相關功能,包括getaddrinfo和相關DNS服務)。

即使通過鏈接所有的C++相關的東西靜態您還取決於libc.so.6,然後你可能有一些GNU庫的版本問題(因此編譯爲一個libc的版本2.17的二進制不會總是與libc的運行2.16或反之亦然)。另外請注意,GNU libc通常與某些內核版本綁定(不能在某個相當老的內核上使用最近的libc)。你可以考慮像MUSL libc

一些替代的libc順便說一句,你通常可以使用一些chroot -ed目標環境(其中可能會安裝一些其他的分佈,例如,與debootstrap

+1

我應該補充說它已經是一個商業上可行的軟件包,但目前沒有計劃開放它的源代碼。這是一個重大的知識產權問題,目前它必須保持封閉的來源。但是,感謝您的洞察力,其中一些將有助於挑選未來戰略。 – 2013-04-27 11:33:02

2

如果有人很好奇,我們通過在RHEL 4.8 dist之上構建GCC 4.8工具鏈解決了這個問題,該工具鏈仍然是我們的構建代理。

它的癥結在於here。由於我們不需要功能齊全的交叉編譯器,問題稍微簡單一些。只需在目標主機上安裝GCC 4.8工具鏈即可。

互操作性仍然很痛苦,因爲這個舊版本的Linux幾乎不支持SMB和/或其他技術。我們結束了一個Bash腳本,它將構建輸出放在一個FTP服務器中,這個工作非常合理。它解決了主要的難題。