
質問は少し具体的なので、次のことを前提とします。
- プログラムの C ソース コードは、プラットフォーム固有の関数を明示的に使用しません (たとえば、システム コールを明示的に使用しません)。
- OS と対話するために、ソース コードは C stdlib を使用します。
- stdlib はコンパイル時にリンクされません。
- プログラムは Linux を実行しているマシン上で Linux 用にコンパイルされ、その後 Windows を実行している別のマシンに移動されました。
- Windows 上でプログラムを実行する前に、Linux 実行ファイルは (何らかの方法で) Windows と互換性のある形式に変換されます。
- 両方のマシンのハードウェアは同じです。
- どちらのマシンにも C stdlib が実装されています。
さて、質問です:
- 上記のすべての仮定を考慮すると、プログラムは Windows 上で実行できますか? そうでない場合、その理由は何ですか?
- 間違った仮定がある場合、それはなぜでしょうか?
答え1
Windows と Linux のバイナリは形式が大きく異なるため、一方を他方で実行することはできません。Linux 共有ライブラリは、Windows DLL とはまったく同じではありません。
クロスシステム実行は、次のいずれかによって実現されます。
- ターゲット システムの再コンパイル (多くのコンパイラは、システム A でコンパイルして B で実行することができます)
- エミュレータ上で実行すると、 ワイン、クロスオーバーなど
- 仮想マシン、Windows Subsystem for Linux (WSL)、Docker などで実行します。
答え2
いいえ。Linux の実行形式は Windows と互換性がありません。プログラムを Windows 用に再コンパイルする必要があります。
あるいは、Windows Subsystem for Linux または Linux を実行している仮想マシンでプログラムをネイティブに実行することもできます。