3

私はプログラミングの初心者で、Ubuntu で C/C++ の作業を行っています。cin/cout/cerr または printf/scanf に何かを伝えたり、コマンド ラインから引数を受け取ったりすると、これはすべて Ubuntu の Linux ターミナルから行われます。

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

4

6 に答える 6

4

まったく同じです。cmdLinux の場合とほぼ同じように、コマンドを実行して記述します。

たとえば、プログラムを にビルドする場合program、Linux で次のように実行します。

./program --option1 -o2 file1 file2

Windows では、最初に出力に.exe接尾辞を付ける必要があり、次に次のcmdように記述します。

program.exe --option1 -o2 file1 file2

基本的にcmdはWindowsの端末です。Linux ターミナルほど優れたものではありませんが、追加のソフトウェアをインストールしなくても十分です。


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

于 2012-04-14T23:50:41.710 に答える
1

cincout、およびprintfscanf、Windows でも Linux とほとんど同じように機能します。(私もかなり確信cerrしていますが、それについては100%確信が持てません。少なくとも、そこにあり、機能します。)最大の違いは、Windowsは通常ワイルドカードを展開しないことです(のようなもの*.txt)プログラムを実行する前に; ほとんどの場合、自分で行う必要があります。

基本的に、アプリが Linux や GCC に固有のものを使用していない限り、テストしたいコンパイラを使用してターゲット マシンで再コンパイルできます。

再コンパイルしたくない場合は...まあ...頑張ってください。Cygwin でさえ、ネイティブの Linux バイナリを実行できません。Linux を搭載した仮想マシンが必要です。

于 2012-04-14T23:52:25.053 に答える
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のようなものに行かなくても、WindowsSDKまたはVisualStudioをインストールできます(ただし、後者の場合は、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>
于 2012-04-15T00:23:22.430 に答える
0

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

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

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

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

現在、メインが呼び出される前に発生するすべてのこと、リンケージなどがどのように解決されるか、およびその他多くのことがシステムに依存します。これが、Windows 上の Linux でコンパイルされた実行可能ファイルを単純に実行できない理由です。

1つを使用cygwinすると、それらのリンクなどが同じで機能する仮想環境を作成するだけです。1 つは ELF 環境を作成します。

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

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

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

つまり、Windows ではシグナルの処理が異なることに注意してください。

于 2012-04-15T00:58:52.637 に答える