私のC++プロジェクトをクロスプラットフォームにしたいのですが、Cygwin/MinGWの使用を検討しています。しかし、それらの違いは何ですか?
もう1つの質問は、Cygwin/MinGWがなくてもシステム上でバイナリを実行できるかどうかということです。
簡略化として、次のようになります:
Cygwinで何かをコンパイルすると、それをコンパイルしますfor Cygwin。
MinGWで何かをコンパイルし、それをコンパイルしていますfor Windows。
Cygwinについて
Cygwinの目的は、Unixベースのオペレーティングシステムが提供する小さな詳細の多くをエミュレートすることで、UnixベースのアプリケーションのWindowsへの移植をはるかに容易にすることであり、 POSIX 標準で文書化されています。アプリケーションは、パイプ、UnixスタイルのファイルおよびディレクトリアクセスなどのUnix機能を使用でき、Cygwinでコンパイルできます。Cygwinは、アプリケーションの周りでcompatibility layerとして機能するため、これらのUnix固有のパラダイムのうち、引き続き使用できます。
ソフトウェアを配布するとき、受信者はCygwinランタイム環境(ファイルcygwin1.dll
で提供)とともに実行する必要があります。これはソフトウェアと共に配布できますが、ソフトウェアはオープンソースライセンスに準拠する必要があります。ソフトウェアをリンクするだけで、dllを個別に配布する場合でも、オープンソースライセンスを尊重する必要がある場合があります。
MinGWについて
MinGWは、GCC、Make、BashなどのGNUコンパイラツールのWindowsへの移植を目指しています。 Unixとの包括的な互換性をエミュレートまたは提供しようとはしませんが、代わりに、GCC(GNUコンパイラー)および少数の他のツールを使用するために最低限必要な環境を提供しますWindows上 =。 CygwinのようなUnixエミュレーションレイヤーはありませんが、その結果、アプリケーションをWindowsで実行できるように特別にプログラムする必要があります。これは、標準のUnix環境での実行に依存して作成された場合、前述のようなUnix固有の機能を使用します。デフォルトでは、MinGWのGCCでコンパイルされたコードは、.exeおよび.dllファイルを含むネイティブWindows X86ターゲットにコンパイルされますが、基本的にGNUを使用しているため、適切な設定でクロスコンパイルすることもできますコンパイラツールスイート。
MinGWは、本質的には Microsoft Visual C++ コンパイラとそれに関連するリンク/作成ツールの代替です。場合によっては、MinGWを使用して、Microsoft Visual C++でのコンパイルを目的としたものをコンパイルし、適切なライブラリを使用して、場合によっては他の変更を加えることができます。
MinGWには、Windowsオペレーティングシステムとやり取りするためのいくつかの基本的な標準ライブラリが含まれていますが、GNUコンパイラコレクションに含まれる通常の標準ライブラリと同様、これらは作成したソフトウェアにライセンス制限を課しません。
重要なソフトウェアアプリケーションの場合、包括的なクロスプラットフォームフレームワークを使用しない限り、それらをクロスプラットフォームにすることは大きな課題となります。私がこれを書いた時点では、 Qt framework はこの目的で最も人気のあるものの1つで、Windowsを含むオペレーティングシステム間で動作するグラフィカルアプリケーションの構築を可能にしましたが、他のオプションもあります。このようなフレームワークを最初から使用すると、別のプラットフォームに移植するときの頭痛を軽減できるだけでなく、すべてのプラットフォームで同じグラフィカルウィジェット(ウィンドウ、メニュー、コントロール)を使用できます。 GUIアプリ、およびそれらはユーザーにネイティブに表示されます。
Cygwinは、Windows上で完全なUNIX/POSIX環境を構築しようとする試みです。これを行うために、さまざまなDLLを使用します。これらのDLLはGPLv3 +でカバーされていますが、それらのライセンスには 例外 が含まれています。 MinGWは、そのようなDLLに依存せずにWindows実行可能ファイルを作成できるC/C++コンパイラスイートです。通常のMSVCランタイムのみが必要です。これは、通常のMicrosoft Windowsインストールの一部です。
_ msys _ と呼ばれるMinGWでコンパイルされた小さなUNIX/POSIXのような環境を得ることもできます。 Cygwinのすべての機能に近いところはありませんが、MinGWを使用したいプログラマには理想的です。
他の答えに追加するために、CygwinはMinGWライブラリとヘッダが付属しており、gccで-mno-cygwinフラグを使用することでcygwin1.dllにリンクせずにコンパイルすることができます。私はこれをプレーンなMinGWとMSYSを使うよりも大好きです。
Wikipediaは比較をします ここ 。
Cygwinの ウェブサイト :から
- CygwinはWindows用のLinux風の環境です。 2つの部分から構成されています。DLL(cygwin1.dll)。LinuxAPIエミュレーション層として機能し、実質的なLinux API機能を提供します。
- Linuxのルックアンドフィールを提供するツールのコレクション。
Mingwの ウェブサイト から:
MinGW( "Minimalistic GNU for Windows")は、依存しないネイティブのWindowsプログラムを作成することを可能にするGNUツールセットと組み合わされた、無料で配布可能なWindows固有のヘッダファイルとインポートライブラリのコレクションですサードパーティのCランタイムDLL
Cygwinは、Windows上でPOSIXのようなランタイムを提供するためにDLL、cygwin.dll(あるいはDLLのセット)を使用します。
MinGWはネイティブのWin32アプリケーションにコンパイルします。
もしあなたがCygwinで何かを構築するなら、あなたがそれをインストールするどんなシステムもCygwin DLLを必要とするでしょう。 MinGWアプリケーションは特別なランタイムを必要としません。
CygwinとMinGWの違いを理解するためにこれらの質問に答えてください。
質問1:私は、一度ソースコードを書き、それを一度コンパイルし、そしてどんなプラットフォーム(例えば、Windows、LinuxおよびMac OS X…)でそれを実行するようなアプリケーションを作成したいです。
答え1:ソースコードをJavaで書いてください。ソースコードを1回コンパイルしてどこでも実行します。
質問2:一度ソースコードを書くアプリケーションを作成したいのですが、プラットフォームごとにソースコードを別々にコンパイルしても問題はありません(たとえば、Windows、Linux、およびMac OS Xなど)。
答え#2:CまたはC++であなたのソースコードを書いてください。標準ヘッダーファイルのみを使用してください。あらゆるプラットフォームに適したコンパイラを使用してください(たとえば、Windows用のVisual Studio、Linux用のGCC、およびMac用のXCode)。すべてのプラットフォームでソースコードを正常にコンパイルするために高度なプログラミング機能を使用しないでください。 CまたはC++の標準クラスや関数を使用しない場合、ソースコードは他のプラットフォームではコンパイルされません。
質問3:質問2の回答では、プラットフォームごとに異なるコンパイラを使用するのは難しいですが、クロスプラットフォームのコンパイラはありますか。
回答#3:はい、GCCコンパイラを使用してください。これはクロスプラットフォームのコンパイラです。 Windowsであなたのソースコードをコンパイルするには、Windows用のGCCコンパイラを提供し、あなたのソースコードをネイティブのWindowsプログラムにコンパイルする MinGW を使用してください。 (Windows APIなどの)高度なプログラミング機能を使用して、すべてのプラットフォームでソースコードを正常にコンパイルしないでください。 Windows API関数を使用している場合、ソースコードは他のプラットフォームではコンパイルされません。
質問4:CまたはC++の標準ヘッダーファイルには、マルチスレッドのような高度なプログラミング機能はありません。私に何ができる?
答え#4:あなたはPOSIX(Portable Operating System Interface [UNIX用])標準を使うべきです。それは多くの高度なプログラミング機能とツールを提供します。 (Mac OS X、Solaris、BSD/OSなどの)多くのオペレーティングシステムが完全にまたは部分的にPOSIX互換です。一部のオペレーティングシステムは、POSIX互換として正式に認定されていませんが、大部分が準拠しています(Linux、FreeBSD、OpenSolarisなど)。 Cygwin は、Microsoft Windows用に、ほぼPOSIX準拠の開発環境とランタイム環境を提供します。
したがって:
Cプログラムを移植するという観点からすると、これを理解するための良い方法は例を取ることです。
#include <sys/stat.h>
#include <stdlib.h>
int main(void)
{
struct stat stbuf;
stat("c:foo.txt", &stbuf);
system("command");
printf("Hello, World\n");
return 0;
}
stat
を_stat
に変更すれば、このプログラムをMicrosoft Visual Cでコンパイルすることができます。このプログラムをMinGWやCygwinでもコンパイルすることができます。
Microsoft Visual Cでは、プログラムはMSVCの再頒布可能なランタイムライブラリmxvcrtnn.dll
にリンクされます。ここで、nn
はバージョンのサフィックスです。このプログラムを出荷するには、そのDLLを含める必要があります。 DLLは_stat
、system
、およびprintf
を提供します。
MinGWの下では、プログラムはmsvcrt.dll
にリンクされます。これは、文書化されていない、バージョン管理されていない、Windowsの一部ライブラリで、アプリケーションの使用には制限がありません。このライブラリは、本質的にはWindows自身が使用するためのMS Visual Cの再配布可能なランタイムライブラリのフォークです。
どちらの場合も、プログラムは同様の動作をします。
stat
関数は非常に限られた情報を返します - 例えば、有用なパーミッションやinode番号はありません。c:file.txt
は、ドライブc:
に関連付けられている現在の作業ディレクトリに従って解決されます。system
は、外部コマンドを実行するためにcmd.exe /c
を使用します。Cygwinの下でプログラムをコンパイルすることもできます。 MS Visual Cで使用される再配布可能なランタイムと同様に、CygwinプログラムはCygwinのランタイムライブラリにリンクされます:cygwin1.dll
(Cygwin固有)およびcyggcc_s-1.dll
(GCCランタイムサポート)。 Cygwinは現在LGPLの下にあるので、GPL互換のフリーソフトウェアでなくても、私たちは自分のプログラムと一緒にパッケージ化して、プログラムを出荷することができます。
Cygwinでは、ライブラリ関数は異なる動作をします。
stat
関数は豊富な機能を持っており、ほとんどのフィールドで意味のある値を返します。c:file.txt
にスラッシュが続かないので、パスc:
はドライブ文字参照を含むものとして全く理解されません。コロンは名前の一部と見なされ、どういうわけかそれに荒廃しました。 Cygwinには、ボリュームまたはドライブに対する相対パスの概念、「現在記録されているドライブ」の概念、およびドライブごとの現在の作業ディレクトリはありません。system
関数は/bin/sh -c
インタプリタを使用しようとします。 Cygwinは、実行可能ファイルの場所に従って/
パスを解決し、sh.exe
プログラムが実行可能ファイルと同じ場所にあることを期待します。CygwinとMinGWの両方でWin32関数を使用できます。 MessageBox
またはCreateProcess
を呼び出したい場合は、それを実行できます。 MinGWとCygwinの下で、gcc -mwindows
を使用して、コンソールウィンドウを必要としないプログラムを簡単に構築することもできます。
Cygwinは厳密にはPOSIXではありません。 Windows APIへのアクセスを提供することに加えて、それはいくつかのMicrosoft C関数の独自の実装も提供します(msvcrt.dll
または再配布可能なmsvcrtnn.dll
ランタイムにあるもの)。この例は、spawnvp
のようなspawn*
関数ファミリーです。これらはCygwin上でfork
およびexec
の代わりに使用することをお勧めします。それらはfork
の概念を持たないWindowsプロセス作成モデルにより良く対応するためです。
したがって:
Cygwinプログラムは、ライブラリの伴奏を必要とするという理由で、MS Visual Cプログラムよりも「ネイティブ」ではありません。 Windows上のプログラミング言語の実装は、C言語の実装であっても、独自のランタイムを提供することが期待されています。 Windowsには公用の "libc"はありません。
MinGWがサードパーティのDLLを必要としないという事実は、実際には不利です。それは文書化されていない、Visual CランタイムのWindows内部のフォークに依存しています。 MinPLWは、GPLシステムライブラリ例外がmsvcrt.dll
に適用されるためこれを行います。これは、GPLベースのプログラムをMinGWでコンパイルおよび再配布できることを意味します。
msvcrt.dll
と比較してPOSIXに対するサポートがはるかに広く、より深いため、CygwinはPOSIXプログラムを移植するためのはるかに優れた環境です。現在はLGPLのもとになっているので、オープンソースでもクローズソースでも、あらゆる種類のライセンスを持つアプリケーションを再配布することができます。 CygwinにはMicrosoftコンソールで動作するVT100エミュレーションとtermios
も含まれています。 RAWモードをtcsetattr
で設定し、VT100コードを使用してカーソルを制御するPOSIXアプリケーションは、cmd.exe
ウィンドウで正しく機能します。エンドユーザーに関する限り、これはWin32を呼び出してコンソールを制御するネイティブコンソールアプリケーションです。
しかしながら:
/bin/sh
のようなハードコーディングされたパスへの依存、その他の問題など、いくつかの奇妙な点があります。これらの違いがCygwinプログラムを「非ネイティブ」にするものです。プログラムが引数としてパスを使用する場合、またはダイアログボックスから入力される場合、Windowsユーザーはそのパスが他のWindowsプログラムと同じように機能することを期待しています。それがそのようにはたらかない場合、それは問題です。 プラグイン: LGPLの発表後間もなく、私は Cygnal (Cygwin Native Application Library)プロジェクトを開始して、これらの問題を解決することを目的としたCygwin DLLのフォークを提供しました。プログラムはCygwinの下で開発してから、再コンパイルせずにCygnalバージョンのcygwin1.dll
と共にデプロイすることができます。このライブラリが改良されるにつれて、MinGWの必要性が徐々になくなるでしょう。
Cygnalがパス処理の問題を解決するとき、Cygnalと一緒にWindowsアプリケーションとして出荷されたときにWindowsパスで動作し、Cygwinの下の/usr/bin
にインストールされたときシームレスにCygwinパスで動作する単一の実行ファイルを開発できます。 Cygwinの下では、実行ファイルは/cygdrive/c/Users/bob
のようなパスで透過的に機能します。 Cygnalバージョンのcygwin1.dll
に対してリンクしているネイティブデプロイメントでは、そのパスは意味がありませんが、c:foo.txt
は理解できます。
CygwinはPOSIX環境全体をエミュレートしますが、MinGWはコンパイル専用の最小限のツールセットです(ネイティブのWinアプリケーションをコンパイルします)。したがって、プロジェクトをクロスプラットフォームにしたい場合は、MinGWが最適です。
WindowsでVS、Linux/UnicesでGCCを使用することを検討するかもしれません。ほとんどのオープンソースプロジェクトがそれを行っています(例:FirefoxやPython)。
Cygwinを商用/プロプライエタリ/非オープンソースアプリケーションで使用するには、Red Hatからの「 license buyout 」に対して数万ドルを分岐する必要があります。これにより、かなりのコストで 標準ライセンス条項 が無効になります。 Google「cygwinライセンスコスト」と最初のいくつかの結果を参照してください。
Mingwの場合、そのようなコストは発生せず、ライセンス(PD、BSD、MIT)は非常に寛容です。最大でmingw64-tdmを使用するときに必要なwinpthreadsライセンスなど、ライセンスの詳細をアプリケーションに提供することが期待されます。
Izzy Helianthusのおかげで編集:CygwinのwinsupサブディレクトリにあるAPIライブラリ 配布中 完全なGPLとは対照的に、LGPLの下で。
ユーティリティの動作は2つの間で真に異なる可能性があることに注意してください。
例えば、Cygwin tarはforkできます - fork()がDLLでサポートされているため - mingwバージョンではサポートされていません。これは、ソースからmysqlをコンパイルしようとしたときの問題です。
Cygwinは、本格的なLinuxのようなプラットフォームを提供するように設計された広範なツールセットを含む、Windows用の多かれ少なかれ完全なPOSIX環境を提供するように設計されています。対照的に、MinGWとMSYSは、軽量でシンプルなPOSIX風のレイヤーを提供します。gcc
やbash
のような、より重要なツールのみが利用可能です。 MinGWのよりミニマルなアプローチのため、Cygwinが提供するPOSIX APIカバレッジの程度を提供していないため、Cygwin上でコンパイル可能な特定のプログラムを構築することはできません。
2つによって生成されたコードに関しては、Cygwinツールチェーンは大きなランタイムライブラリcygwin1.dll
への動的リンクに依存していますが、MinGWツールチェーンはコードをWindowsネイティブCライブラリmsvcrt.dll
に動的にリンクするバイナリに静的にリンクします。 glibc
。したがって、Cygwin実行可能ファイルはよりコンパクトですが、個別に再配布可能なDLLが必要です。一方、MinGWバイナリはスタンドアロンで出荷できますが、サイズが大きくなる傾向があります。
Cygwinベースのプログラムを実行するには別のDLLが必要であるという事実も、ライセンスの制限につながります。 Cygwinランタイムライブラリは、OSI準拠のライセンスを持つアプリケーションのリンク例外を除いてGPLv3の下でライセンスされているため、Cygwinを中心としたクローズドソースアプリケーションを構築したい開発者はRed Hatから商用ライセンスを取得する必要があります。一方、MinGWコードは、オープンソースとクローズドソースの両方のアプリケーションで使用できます。ヘッダーとライブラリには許可が与えられているからです。
Cygwin
は互換性レイヤーを使用しますが、MinGW
はネイティブです。それが主な違いのひとつです。