
たとえば、Ubuntu を実行しているマシンで GTK 3 を使用する単純な C プログラムをコンパイルした場合、それを他の Linux フレーバーで実行できますか?
注: 私の実際の質問は、「コンパイルしたプログラムに Linux 用ラベルを付けるべきか、それとも Ubuntu 用ラベルを付けるべきか?」です。
例えば、ダウンロードページには次のようにラベルを付けるべきですか?
Windows
program.exe
Linux
program
Macintosh
program.app
または
Windows
program.exe
Ubuntu < Version 17.04
program
Macintosh
program.app
答え1
Linux 実行ファイルは Linux ディストリビューションに固有のものではありません。ただし、プロセッサ アーキテクチャとライブラリ バージョンのセットに固有のものです。
実行可能ファイルどれでもオペレーティング システムはプロセッサ アーキテクチャに固有です。Windows および Mac のユーザーは、これらのオペレーティング システムが多かれ少なかれ単一のアーキテクチャでのみ実行されるため、それほど気にしません。(OSX は複数のプロセッサ アーキテクチャで実行されていました。また、OSX アプリケーションは通常、サポートされているすべてのプロセッサ アーキテクチャのコードを含むバンドルとして配布されていましたが、最近の OSX は amd64 プロセッサでのみ実行されます。Windows は 32 ビットと 64 ビットの両方の Intel プロセッサで実行されるため、「32 ビット」および「64 ビット」の Windows 実行ファイルが見つかる場合があります。)
Windows では、プログラマーが使用するすべてのライブラリをプログラムにバンドルするように強制することで、ライブラリの依存関係の問題を解決しています。Linux では、これを実行することは一般的ではありません。プログラマーがライブラリをバンドルする必要がなく、ユーザーがライブラリのセキュリティ更新とバグ修正をタイムリーに受けられるという利点がありますが、ディストリビューションのリリースごとにプログラムを別々にコンパイルする必要があるというコストがかかります。
したがって、バイナリに「Linux、64 ビット PC (amd64)、Ubuntu 17.04 用にコンパイル」(または 32 ビット実行可能ファイルの場合は「32 ビット PC (i386)」) というラベルを付け、必要なライブラリの詳細を指定する必要があります。実行可能ファイルで使用されるライブラリは、コマンドldd
runで確認できますldd program
。 の前の部分=>
が重要です。たとえば、libgtk-3.so.0
メインの GTK3 ライブラリはバージョン 0 です (バージョン 1 があった場合、バージョン 0 と互換性がないため、バージョン番号を変更します)。これらのライブラリの一部は、長年にわたって変更されていないため、誰もが持っているものです。経験、または複数のディストリビューションと複数のリリースを比較することによってのみ、これを知ることができます。他のディストリビューションのユーザーは、互換性のあるバージョンのライブラリがあれば、同じバイナリを実行できます。