異なるプラットフォームで動作する C++ ソースからコンパイルされた単一のネイティブ実行可能ファイルを持つ方法はありません。 2 番目の段落で述べているように、同じ実行可能ファイルが Windows と Linux で実行されるとは思えません。
簡単な答えは、できないということです。
PE (Windows) と ELF (Linux) のバイナリ実行形式はまったく異なります。
C/C++ プログラムは、どちらのプラットフォームでも同時に利用できないライブラリへのリンクを必要とすることは言うまでもありません。
ただし、Linux で Wine を使用して、エキゾチックな Windows 固有の呼び出しを試みない限り、Windows 実行可能ファイルを実行できます。
または、CLI 言語 (C#/IronPython/Java など) などのより「一般的な」クロスプラットフォーム言語を使用することを選択できます。これは、Windows 用の .NET および Linux/その他用の Mono がサポートするものです。
わかりました、子供たち。
はい、マルチプラットフォームのバイナリを書くことはできますが、難しいです。これは Fat Binary と呼ばれ、1980 年代には十分一般的でしたが、私はそれが何十年も行われているのを見たことがありません。 https://en.wikipedia.org/wiki/Fat_binary
基本的に、実行するプラットフォームごとにマシン コードをコンパイルし、そのコードをさまざまなエントリ ポイントに手動でリンクします。ウィキペディアの記事では、異なるアーキテクチャを同じバイナリに詰め込むことについて説明しているだけですが、オペレーティング システムのエントリ ポイントが衝突しない限り、異なるオペレーティング システムで実行される 1 つのバイナリを実際に作成することは可能です。
一部の実行可能形式は、意図的にこれを可能にするように設計されています。たとえば、MZ、NE、LX、および PE をオーバーレイできます。古い OS/2 プログラムは時々これを行いました...両方のオペレーティング システム用のプログラム全体が含まれることはめったにありませんでしたが、DOS で実行すると、プログラムに間違ったオペレーティング システムを使用していることを示すメッセージが出力されました。
1 つのバイナリでの Linux と Windows に関する限り: ELF と PE を実行することはできませんが、できると思います PIE または COFF と PE または COM で実行可能です。古い Linux では、PE の派生元である COFF バイナリが実行されるため、if ユニバーサル バイナリを作成できるようです。 Linux の新しいバージョンでもこれらを実行できます。これがうまくいくとは断言できませんが、もっともらしく思えます。
もう 1 つの注意点:通常、他のオペレーティング システムのエントリ ポイントやヘッダーなどをスキップするために、コードの最初にジャンプを挿入する必要があります。そこにコードを見つけることができないためです (明らかに)。
現代のコンピューティングにおけるこれの問題は、ほとんどのウイルス対策ソフトウェアがこれを誤ってウイルスとして識別することです。ウイルスがバイナリの最後にジャンプする実行可能ファイルの先頭にこのようなジャンプを挿入し、バイナリの最後に独自のコードを追加してから、メインの実行可能ファイルに戻る別のジャンプを挿入することにより、バイナリを攻撃するのが一般的でした。コード。 1 つのバイナリで複数のプラットフォームをサポートするには、多かれ少なかれ同様のことを行う必要があるため、ほとんどの AV ソフトウェアはこれをヒューリスティックにウイルスとして識別し、実行可能ファイルを隔離します。
つまり、はい、プラットフォームの(いくつかの)組み合わせに対して実行できます。不可能ではありませんが、それを行うには気が狂わなければなりません.