MinGWって何なんだ?


MinGWって何なんだ?
0.MinGWとは
MinGW、すなわちMinimalist GNU For Windows.サードパーティ製ダイナミックリンクライブラリなしでGCC(GNU Compiler C)を使用してWindows 32プログラムを生成できるヘッダファイルとポートライブラリの集合です.
実はMinGWはC/C++コンパイラではなく、GNUツールセットです.GCC(GNUコンパイラセット)のほか、MinGWには他のGNUプログラム開発ツール(gawk bisonなど)が含まれています.
MinGWの開発はLinux(FreeBSD)オペレーティングシステムでの作業が嫌いでWindowsに残っている人のためにGNUに適したGNU作業環境を提供するためである.
1.MinGWインストール
  • ダウンロードMinGW;ダウンロードが完了すると、mingw-get-setup.exeの名前のインストールパッケージが得られ、ダブルクリックして開くとインストールできます.
  • minGW installerを実行します.中には選択肢がたくさんありましたが、当時は迷っていましたが、どれを選ぶべきか分かりません???実は今も知らないで、すべてネット上の他の人の言うことによって选びました......不足があって、赘沢なこともあります
  • 環境変数
  • の構成
  • はcmdに入る.入力gcc-v;バージョン情報が表示されたらGCCをインストールします.

  • 3.MinGWとCygwin:原理と比較
    MingWとCygwin
    まずMinGWとCygwinはプラットフォーム間開発に使用できる.
    MinGWはMinimalistic GNU for Windowsの略、つまりWin版のGCCです.
    CygwinはLinuxのインタフェースを全面的にシミュレートし、それを実行するプログラムに提供し、既存のソフトウェアを大量に提供し、プラットフォームのようにしています.
    相対的なMingWにもMSysという(Minimal SYStem)のサブプロジェクトは、主にLinuxをシミュレートするShellといくつかの基本的なLinuxツールを提供しています.大規模なプログラムをコンパイルするには、GCCだけでは不十分で、Autoconfなどのツールでプロジェクトを構成する必要があるため、一般的にWindowsでffmpegなどのLinuxの大規模なプロジェクトをコンパイルするのはMsysで行われています.もちろんMsysは補助環境では、根本的な仕事はMingWがやっています.
    きほんげんり
  • コンパイラを修正し、Windowの下のコンパイラにforkなどの呼び出しを等価な形式に翻訳させるのがMingWのやり方である.
  • ライブラリを修正し、WindowにUNIXが提供するライブラリのようなものを提供させ、プログラムに対するインタフェースはUNIXのようにしているが、これらのライブラリは、もちろんwin 32のAPIによって実現されている.これがCygwinのやり方である.

  • MingWとCygwinでコンパイルしたプログラムの違い
    まずMingWとCygwinはLinuxの下のプログラムをWindows上で直接実行することはできません.ソースコードで再コンパイルする必要があります.
    現代のオペレーティングシステムはWindowsとLinuxの基本的な設計概念を含んで、プロセススレッドのアドレス空間の仮想メモリのようなこれらはすべて大同小異で、なぜ両者の上のプログラムは互換性がなくて、主にこれらの機能の具体的な実現上の相違に対して、まず実行可能なファイルのフォーマットで、WindowはPEのフォーマットを使って、しかも要求します.EXEは接尾辞名です.LinuxはElfを使用します.次に、WindowsがCreateProcess()でプロセスを作成し、Linuxがfork()を使用するように、オペレーティングシステムのAPIも異なります.
    だからプログラムを移植するには必ずこれらの場所で変更しなければならない.MingWには専用のW 32 apiヘッダファイルがあり、コード中のLinux方式のシステム呼び出しを対応するWindows方式に置き換える.Cygwinはcygwin 1を通過する.dllというファイルはこのようなAPIの変換を実現し、Linuxシステム呼び出しインタフェースをプログラムにシミュレートし、プログラムは依然としてLinux方式でシステムAPIを呼び出すが、このAPIはcygwin 1にすぎない.dll上、cygwin 1.dllはWindows対応の実装を呼び出し,結果をプログラムに返す.
    コンパイルしたプログラムのインポート・テーブルを表示して、この点を検証できます.
    両者が生成したプログラムはいずれもWindows上で実行可能なEXEファイルであり、明らかにPE形式であり、1つのPE形式表示ツールでチェックすると、Cygwinが生成したプログラムは依然としてfork()のようなLinuxシステム呼び出しがあるが、ターゲットライブラリはcygwin 1である.一方、MingWが生成したプログラムは、全てKERNEL 32から導出された標準WindowsシステムAPIを使用する.
    これでMingWでコンパイルするプログラムの性能は少し高くなり、その2兆に近いcygwin 1を持っていなくてもいいようです.dllファイル.
    しかし、CygwinのLinuxのシミュレーションは比較的完全で、Cygwin Xのプロジェクトさえあり、直接CygwinでXを走ることができます.
    さらにCygwinは、MingWコンパイルを使用するために-mno-cygwinのflagを設定することができる.
    Cygwinと比較可能なMSys上のツールもCygwinというシミュレーションによって提供される.
    要するにこの2つのプロジェクトは千丝万缕の関系があって、1つの不适切な例、もしMingwがMFCならば、Cygwinはです.NETです.
    4.Windowsプラットフォーム上でMinGWを使用してLinuxプログラムをコンパイルする
    1.    mingw32
    2. mingw bin msys\1.0 bin     path
    3.  msys.bat
    4.cd     
    5.  ./configure
    6.  make
    7.  make install
    8.cd C:\MinGW\msys\1.0\local\lib
    9.ar x ***.a
    10.ar r ***.lib *.o
       ***.lib,    C:\MinGW\msys\1.0\local\include

    5.WindowsでMinGWコンパイルを呼び出す関数ライブラリ
    静的ライブラリ関数
    静的ライブラリの拡張子は一般的に.lib(windows上)または.a(linux上)、彼とダイナミックライブラリ(dll)には違いがあります.静的ライブラリコンパイルを呼び出すと、実行プログラムに書き込まれます.独立して実行できます.ダイナミックライブラリは、呼び出し時にdllをロードして正常に動作するように動的に呼び出すことを目的としています(したがって、ダイナミックライブラリはパッチを提供したり、機能のアップグレード時に使用したりすることがよくありますが、実行速度は協議されます).また、2つのライブラリのコンパイラも異なる、例えばmingwがg++でダイナミックライブラリ*を生成する.dllは、arで静的ライブラリ*を生成する.a;VCはlinkを用いる.exeは生成動的ライブラリと静的ライブラリを生成し,optionsでどのライブラリを生成するかを区別する.

    次に、いくつかのC++とCファイルをMinGW上で静的ライブラリ関数ファイルにコンパイルし、Windows上でこのライブラリ関数を呼び出します.
    ライブラリ関数ファイルmyf 1が2つあるとします.cppとmyf 2.c
    //myf1.cpp
    #include 
    void f1_Fonction1(int a, double b, char *c)
    {
        printf("    myf1.cpp f1_Fonction1  
    "
    ); } int f1_Fonction2(int c) { printf(" myf1.cpp f1_Fonction2
    "
    ); return c+1; }
    //myf2.c
    #include 
    void f2_Fonction1(void)
    {
        printf("    myf2.c f2_Fonction1  
    "
    ); } int f2_Fonction2(int c) { printf(" myf2.c f2_Fonction2
    "
    ); return c+2; }

    上の2つのファイルは1つはC++で、もう1つはCです.2つのファイルにはそれぞれ2つの関数があります.まずgccコマンドでターゲットファイルmyf 1にコンパイルします.oとmyf 2.o
    gcc -c myf1.cpp myf2.c

    次にarコマンドを使用して静的ライブラリmylibを生成する.lib
    ar r mylib.lib myf1.o myf2.o

    今、Windowsでこのライブラリの関数を呼び出してみましょう.簡単な呼び出しのC++プログラムmainを書きます.cpp
    //main.cpp
    #include 
    using namespace std;
    void f1_Fonction1(int a, double b, char *c);
    int main()
    {
        char c;
        f1_Fonction1(1,2.0,&c); //   myf1     f1_Fonction
        cout << "Hello world!" << endl;
        return 0;
    }

    それからMinGWでコンパイルして、先生はmainになります.oファイル
    gcc -c main.cpp

    それからmain.oと関数ライブラリmylib.libを接続してmainを生成する.exeファイル
    g++ -o main.exe main.o mylib.lib

    GNUとは
    GNU計画は、革奴計画とも呼ばれ、Richard Stallmanが1983年9月27日に公開した.完全に自由なオペレーティングシステムを作成することを目標としています.
    GNUは「GNU is Not Unix」の再帰的な略語である.StallmanはGNUがnewという単語と混同されないようにGuh-NOOと発音すべきだと発表した.(注:Gnuは英語ではアフリカのカモシカを意味し、発音はnewと同じ).UNIXは広く使われている商業オペレーティングシステムの名称である.GNUはUNIXシステムのインタフェース標準を実現するため、GNUはそれぞれ異なるオペレーティングシステムの部品を開発する計画である.GNUは、TeXレイアウトシステムやXウィンドウウィンドウウィンドウウィンドウシステムなど、当時すでに自由に使用可能だったソフトウェアの一部を採用する計画であるなど.しかし、GNUは他のフリーソフトも大量に開発する計画だ.