2013-04-27 8 views
10

スコアを決める手助けをしてください。複数のプラットフォーム用にLinuxバイナリを構築する

私はできるだけ多くのLinuxディストリビューションで動作するように作られたソフトウェアをC++で作成しており、効果的な戦略を見つけ出す必要があります。私はバイナリをこのケースではソースコードではなく出荷しようとしています(知っていると良いかもしれません)。 これはすでに商用製品であり、私は製品のオープンソース化を妨げる知的財産権の問題を抱えていますが、無数のGPL問題に対処しなければならないということも意味します。

推論の現行の行は、最小限の共通点を選んで、すべてを構築することでした。それは、私が生産性を失うという2つの大きな意味を持っています。

  1. GCCの古いバージョンのC++サポートには、最新のC++機能が欠けています。
  2. 最小公倍数は、Red Hat Enterprise Linux 4(RHEL4)を伴う

私は間違いなく、セット全体C++ 11の機能は必要ありませんが、私はそれにC++のサポートを起動したいのですが私は可能な限りGCC/libstdC++とは対照的にClang/libC++を使用する考え方を熟読しています。

RHEL4は、C++アプリケーションを構築するための広範なクロスプラットフォームサポートを備えていないようですが、それ以上は、Linuxのさまざまなバージョン間でABIの安定性に関する洞察はほとんどありませんが、少数に基づいてすべてのディストリビューションを構築しようとするのは実行可能な戦略ではありません。

私は、Linuxのさまざまなディストリビューションのためのコンパイルソフトウェアは、ターゲットプラットフォーム上のツールを使ってターゲットプラットフォーム用のソフトウェアをコンパイルすることで最も効果的だと考えています。私は現在、あなたがこれを受け入れないならば、あなたがLinuxプラットフォーム間で広大な移植性の問題に遭遇するという前提の下でも動作しています。プラットフォーム/ディストリビューション間でのC++ ABIの不安定性のために、リンクできないライブラリの数については言及しません。

しかし、私は間違っている可能性があります。これを定期的に処理する人々から聞きたいのですが。何がうまくいくのですか?もっと重要なことに、何がうまくいかないのでしょうか?

+3

もし私がLinux上でビッグ・レポートをしたら、どうすればソフトウェアを支払うのでしょうか?サポートされているバージョンのLinuxでプロダクションをテストしなければならないプロダクションをサポートしているはずです。各自のためのVMとそこに構築する – Mark

+0

@マーク私の考えを正確に、それは進行中の作業です。 –

+0

http://stackoverflow.com/questions/2157636 | | http://stackoverflow.com/questions/16250831 | http://stackoverflow.com/questions/15386027 –

答えて

7

あなたがに焦点を当ててみてください(ここであなたがdebootstrapと。例えば、いくつかの他のディストリビューションをインストールするかもしれない)いくつかのchroot -edターゲット環境を使用することができます検討することもでき個々のディストリビューションではなく、主要なプラットフォームはほとんどありません。私がそれを意味するのは、私が "基礎的なディストリビューション"(DebianとRedHat)と呼ぶものをベースにして、他のもののベストを願うことです。

おそらく、(静的にリンクされている)Debianバイナリは、UbuntuやMint、その他のDebianの派生ディストリビューションでうまく動作します。 RedHatバイナリはおそらくCentOS、Scientific Linux、SuSE Linux上で動作します。あまり普及していないディストリビューションを気にする人がいる場合(DebianやRedHatの実行可能ファイルではなく、何とか動作させることはできません)、そのディストリビューションのVMをセットアップし、実行可能ファイルを1つビルドします特にその味のために。

私は過去にこのアプローチを採用しており、うまくいきました。

+1

しかし、DebianとRHELのバイナリを別々にすることをお勧めしますか? –

4

あなたのソフトウェアをいくつかのオープンソース(オープンソースのGPLv3 +ライセンスなど)にする最も良い方法は、あなたのソフトウェアが面白いと思うならば、ディストリビューションにパッケージ化されます。

インストールパッケージが最も簡単なので、配布パッケージ(例:.deb UbuntuまたはDebian用)を提供したいと考えています。

あなたはまだ独自のソフトウェアを作成する場合(ただし、あなたが無償配布しても、販売、またはすることができます場合は、自分自身に尋ねる、成功しソフトウェア)は、次の手順かかる場合があります:

  • 静的なstdC++ &を静的なlibgcc(GCCが提供していないほとんどのディストリビューション)を有効にすることによって、最近のGCCコンパイラ(例えば4.8)をコンパイルしてください。

  • プログラムを静的にリンクしている可能性があります(例:​​関連のサービス(getaddrinfoや関連するDNSサービスなど))。

でも静的にすべてのC++関連のものをリンクすることにより、したがってlibcのバージョン2.17用にコンパイルされたバイナリは常に、libcの2.16かで実行されません(あなたはまだlibc.so.6に依存して、あなたには、いくつかのヌーのlibcバージョン管理の問題が発生する可能性があり逆に)。また、GNU libcは通常、いくつかのカーネルバージョンに結びついています(かなり古いカーネルでは最近のlibcを使用できません)。あなたはMUSL libc

のようないくつかの代替のlibcはところで、あなたは通常

+1

私はそれが既に商業的に実行可能なソフトウェアパッケージだが、現時点ではソースをオープンする計画はないと付け加えるべきであろう。これは重要な知的財産の問題ですが、現在はクローズドソースにしておく必要があります。しかし、あなたの洞察力のおかげで、このうちのいくつかは今後の戦略を選ぶのに役立ちます。 –

2

好奇心が強い人は、RHEL 4.8 distの上にGCC 4.8ツールチェーンをビルドすることで問題を解決しました。

その要点はhereです。完全に機能するクロスコンパイラは必要ないので、問題は少しシンプルでした。ターゲットホスト上のちょうどGCC 4.8のツールチェーン。

この古いバージョンのLinuxは、SMBやその他の技術をほとんどサポートしていなかったため、相互運用性は依然として痛みでした。私たちはFTPサーバーにビルド出力を入れるBashスクリプトを作成しましたが、これはうまくいきました。それは大きな痛みを解決した。

関連する問題