- ベストアンサー
VisualC++でコンパイル、Linuxサーバ側で実行
プログラムの勉強をしている者です。 最近、 「Windows側でVisualC++を利用してコンパイルし、それをLinuxに持っていって、Linuxサーバで実行する」 という、話を聞きました。 調べてみると、「クロスコンパイル」というものに該当しそうだと思うのですが、まったく理解できません。 Windows側の.exeファイルをそのままLinuxに持っていっても当然実行できないのに、なぜ、上のようなことができるのか不思議です。 どなたか、教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VCで普通にコンパイルをすると、実際にはcl.exeというコンパイラが使われます。 これは、Windows用です。但し、VCのIDEは、使うコンパイラを設定することができます。 例えばLinux用のクロスコンパイラを用意して(VC自体には付属してません)使えばOKです。 通常のコンパイラは、自分の動作環境と出力オブジェクトの動作環境が同一ですが、 クロスコンパイラは、自分とは違う動作環境用(ここではLinux)のオブジェクトを作ります。 これは、Linuxで普通のコンパイラを使った場合と、同様なexeを作れるということです。 但し、作れるというだけで、Windows ではそのまま動かないものになります。 # 提示の条件だけだと、Linux サーバ上で Windows のエミュレーション環境が動いてる可能性もありますが…。
その他の回答 (2)
- ackapapa
- ベストアンサー率44% (8/18)
簡単なたとえでは プレイステーションなどのゲームはPC上で作成しますが PC上では(通常)動きません PCで作成→CD作成→ゲーム機で動作 をさせないと(通常)動きません。 ゲーム機本体でゲームを作成することは(基本的に)出来ません。 (通常)と付けたのは、PC上でゲーム機のエミュレーション機能があれば動作します。 エミュレーションは仮想的に動作させることです。 詳しくは「エミュレーション」で検索すればわかると思います。
お礼
ありがとうございました エミュレーション機能は利用しておらず、 あくまで実機での実行です。 教えてくださった例だと、クロスコンパイルの必要性を感じますが、Windows-Linux間となると、いまいち「なんで?」と思ったのがきっかけでした。
クロスコンパイルはターゲット用のバイナリを生成できる。 普通windows用のコンパイラは int main(){printf("hello world\n");} のような人が判るコードをCPUが理解できる命令コード群(機械語)に置き換える作業をする。 クロスコンパイラはこの機械語のテーブルとでも言おうか、ターゲットPC用のテーブルで命令コード群を生成できる。 (だからクロスコンパイラとして作成しておかないとできない) クロスコンパイラが存在する事によって、負荷が高く直接コンパイルするのが困難な環境用へのプログラムのコンパイルがより快適(正しくはリソースが空いている)なPCで行う事ができるようになる。 極端な話、windowsでMacOSX用のバイナリを吐かせる事もできなくもない。
お礼
ありがとうございました。 クロスコンパイルの意義を理解できました。
お礼
>例えばLinux用のクロスコンパイラを用意して(VC自体には付属してません)使えばOKです。 ということは、自前でgccといったコンパイラをVC側に持ってきて、それを使うようにVCで設定する。といった解釈でいいのでしょうか? お話を聞いているうちに、自分でも試したくなってきました。現在は具体的な方法をWebで探しいます。 もし、ご存知でしたら教えてください。 ありがとうございました。