WindowsのビジュアルC ++コンパイラーがLinuxバイナリ実行可能ファイルを生成するのが難しいのはなぜですか
Microsoft側でそれを実行したくないという以外は、まったく何もありません。障害は技術的なものではありません。
開発ツールチェーンは、入力を受け取り、出力を生成する単なるプログラムです。Visual C ++はx86アセンブリを生成し、アセンブラを使用してそれをCOFFオブジェクトファイルに変換します。Microsoftが代わりにELFを生成するようにしたい場合、それは単なるコードです。アセンブリが入ってきて、ELFが出ます。オブジェクトファイルやライブラリに魔法はありません。それらは、よく理解された形式の単なるデータの塊です。
石器時代にさかのぼると、クロスコンパイルははるかに困難でした。それは、たいていの場合、ターゲットプラットフォームのツールチェーンを、それが実行されるプラットフォームのアセンブリで作成していたためです。つまり、VAX、M68K、Alphaアーキテクチャが世界中にあったとしても、クロスコンパイラの完全なスイートでは、それらのほとんどをゼロから作成する必要がありました。(VAX-to-VAX、VAX-to-M68K、VAX-to-Alpha、M68K-to-VAX、M68K-to-M68Kなど)VAXコンパイラーの一部は再利用でき、各ターゲットのコードジェネレーター(VAX、M68K、Alphaなど、VAX用に作成されたもの)に接続されています。
この問題は、Cなどの特定のプロセッサに関連付けられていない言語でコンパイラを作成し始めたときに解消されました。そのルートに進むと、Cでツールチェーン全体を1回記述し、ローカルプラットフォーム向けに作成したそれをビルドするCコンパイラ。(ローカルプラットフォームのコンパイラーでブートストラップされた後、コンパイラーを使用して再コンパイルすることがよくありますが、これは別の議論です。)クロスコンパイラーの構築は、ネイティブコンパイラーの構築と本質的に同じ努力になったということです。ローカルプラットフォーム。唯一の重要な違いは、ビルドプロセスのどこかで、ローカルプラットフォーム用のコードジェネレーターではなく、ターゲットプラットフォーム用のコードジェネレーターでコンパイルするように指示したことです。
コンパイラーのアーキテクチャーが進化するにつれて、すべてのコードジェネレーターを製品に含めてビルドし、実行時に使用するコードジェネレーターを選択するのが便利になりました。Clang / LLVMがこれを行います。他にもあると思います。
機能するツールチェーン(コンパイラー、アセンブラー、リンカー)を取得すると、ライブラリーはソースからビルドされ、最終的には他のプラットフォーム用の実行可能ファイルを作成するために必要なすべてのものが揃います。