たとえば、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と互換性がないため、バージョン番号が変更されました)。これらのライブラリのいくつかは何年も変わっていないので、誰もが持っているでしょう。複数のディストリビューションと複数のバージョンを見ている経験や比較によってのみ知ることができます。他のディストリビューションユーザーは、互換性のあるライブラリバージョンがある場合は同じバイナリを実行できます。