2012-04-14 10 views
3

私はプログラミングの初心者です。私はUbuntuのC/C++で仕事をしています。私がcin/cout/cerrやprintf/scanfに何かを伝えたり、コマンドラインから引数を取ったりすると、これはすべてUbuntuのLinux端末から起こります。WindowsでLinuxコマンドラインプログラムを動作させる方法は?

これらのプログラム(非常に単純なプログラム、初心者レベル)を実行してWindowsで実行したい場合は、Windowsコマンドラインからどのように実行すればよいですか?以前のコースではcygwinをダウンロードしてWindowsのLinuxコマンドラインをシミュレートしましたが、通常のウィンドウコマンドラインからプログラムを実行したいのですが?それは可能なのですか?ソフトウェアの変更が必要ですか?

+0

"シミュレートされたコマンドライン"のようなものはありません。 Windowsには、Linuxと同じように、ネイティブcommmand-lineインターフェイスがあります。 –

+1

@KerrekSB:Cygwinは、Windows上でUnixライクな環境を提供します。 Cygwinのコマンドラインは、Windowsコマンドラインではありません。 – celtschk

+0

@celtschk:Cygwinは、まずWin32用のPosix APIです。それにはいくつかの追加の端末サポートがありますが、それはOPの状況の中心ではありません。 –

答えて

6

Windows用のプログラムをlinuxからクロスコンパイルできます。 Ubuntuで

は、プロセスは基本的にはこれです:

須藤はapt-getのワインMINGW32 MINGW32-のbinutils MINGW32ランタイム

インストール...

のi586-mingw32msvc-G ++ -o myprogram.exeというmyProgram.cpp

簡単、右? Googleは「ubuntu cross-compile windows」のためにそこにたくさんの情報があります。

4

これはまったく同じです。 cmdを実行して、Linuxの場合とまったく同じように(ほぼ)コマンドを書きます。

あなたがprogramにあなたのプログラムをビルドする場合たとえば、あなたはこのようにLinux上でそれを実行します:

./program --option1 -o2 file1 file2 

とWindowsで、最初のあなたは出力が.exeサフィックスを持たせる必要があり、その後cmdで次のように記述します。

program.exe --option1 -o2 file1 file2 

を基本的にcmdは、Windowsのターミナルである、と言って。 Linux端末ほど良いところはありませんが、それは追加のソフトウェアをインストールしなくても得られます。


cin/cout/cerrprintf/scanf/fprintf(stderr, ...)標準Cは、LinuxとWindowsの両方で定義されているファイルstdinstdoutstderrをpreopened使用しています。 Windowsの端末(cmd)からアプリケーションを実行すると、Linux端末とまったく同じように入出力が表示されます。 I/Oリダイレクトも非常に似ています。彼らは、Linuxで行うよう

+0

クロスコンパイルすると、cmd.exeシェルに関する問題が回避されます。ウィンドウのクロスコンパイルに依存しているLinuxプログラムは期待どおりに動作しますが、MSVCでコンパイルするとシェルの拡張は失敗します。 –

+0

@ggg、シェルの拡張はどういう意味ですか?そして、(クロス)コンパイルは入力を入力して出力を見ることと何が関係していますか? – Shahbaz

+0

彼は、Linux用のバイナリは単にWindows上で拡張子「.exe」を追加して実行するだけではないことを意味します。 Windows用のソースからコンパイルする必要があります。 – vvnraman

1

cincout、およびprintfscanfは、Windowsでずっと同じ仕事します。 (私はかなり確信していますcerrもそうですが、その1つは100%確信していませんが、少なくともそこでもそこにあります)最大の違いは、Windowsは一般的にワイルドカードを展開しないことです*.txt)を実行してください。ほとんどの場合、あなた自身でそれを行う必要があります。

基本的には、アプリケーションがLinuxやGCCに特有のものを使用しない限り、テストするコンパイラを使用してターゲットマシン上で再コンパイルするだけで済みます。

あなたが再コンパイルしたくない場合は...まあ...それに幸運。 CygwinでもネイティブのLinuxバイナリは実行されません。 Linux上に仮想マシンが必要です。

0

あなたが移植性があり、Linux特有の機能を使用していない場合は、Windows上でソースをコンパイルしてWindows上で動作させる必要があります。

TDM-GCCホームページから入手できるWindows用のGCCツールチェーンが必要です。そのMinGWは内部的にインストールすることができ、インストールする機能とインストール先のディレクトリを選択することができます。また、Windowsのパスに自身を追加するので、シェルプロンプトからコンパイラコマンドを使用できるようになります。

私は定期的にクロスコンパイルをしなければならず、問題なく動作します。あなたのプロジェクトがMakefilesを使用している場合には、一つの変更が必要です。 linuxの<target>.outのようなターゲットバイナリでは、Makefileを編集して、コマンドラインで実行するように<target>.exeに名前を変更する必要があります。 Makefileを使用せずにgcc <file.c>を実行している場合は、デフォルトでa.exeが生成されます(Linuxではa.outに似ています)。

0

はあなたがUNIXおよびWindows上で実行する場合は、このプログラムコードを持って言う:

#include <stdio.h> 
int main() 
{ 
    printf("Hi\n"); 
    return 0; 
} 

あなたはUNIXシェルでコマンドを入力すると、それはこのようなものになります。

/usr/home/bobby# gcc main.c 
/usr/home/bobby# ./a.out 
Hi 
/usr/home/bobby# 

Windowsでは、まず開発環境/コンパイラを選択する必要があります。 Cygwinのようなものに行かなくても、Windows SDKまたはVisual studioをインストールすることができます(後者の方がGUIで開発したいと思うかもしれませんが)。

Start -> Run -> cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86 
C:\Windows\system32>cd c:\bobby 
C:\bobby>cl main.c 
C:\bobby>main.exe 
Hi 
C:\bobby> 
0

Cプログラムを実行可能ファイルにコンパイルすると、システムに依存した方法で実行されます。 UbuntuではELF形式が使用され、WindowsではPEが使用されます。

プロセスを開始すると、メモリを割り当てる方法と、プロセスのさまざまな部分を仮想メモリテーブルに配置する方法についての説明と地図が表示されます。さらに、同じライブラリを使用している他のプロセスと共有する、すでに物理メモリにある動的にロードされたライブラリにリンクします。動的ライブラリが存在しない場合は、それらをロードします。 (Linux .so、windows .dll)。静的ライブラリがある場合、これらは割り当てられ、リンクされます(Linux .a、Windows .lib)。 - 非常に単純化された。

メモリ制限などは、前のプロセスから継承されます。

環境変数はプロセスの実行環境に入れられます。これはパス、引数などです。次にmain()がスタックに追加されて呼び出されます。

メインが呼び出される前に起こっていたこと、リンケージなどが解決されたことなど、他の多くのことはシステムによって異なります。これは、Windows上のLinuxでコンパイルされた実行可能ファイルを実行できない理由です。

cygwinを使用すると、これらのリンケージなどが同じで動作する仮想環境を作成するだけです。 1つはELF環境を作成します。

ネイティブのWindowsコマンドラインにリンクするには、Windows用にコンパイルする必要があります。そのことについてはすでに多くの回答があることがわかります。

ELFとPEは、異なるシステムと同様に、環境変数などを扱う方法が異なります。これらは何かなどです。つまり、ファイルの展開は別の方法で処理されます。しかし、両方の実行中のプロセスは、stderr,stdoutおよびstdinのようなデフォルトのストリームを持っています。しかしの下にあなたのコードは同じではありません。

ディーゼルとガソリン車を運転するようなものです。多くは同じですが、フードの下でかなりのものが異なります。

Windowsでは信号が異なっていることに注意してください。

関連する問題