답변:
간단히 말하면 다음과 같습니다.
Cygwin에서 무언가를 컴파일하면 Cygwin 을 위해 컴파일하고 있습니다 .
MinGW에서 무언가를 컴파일하면 Windows 용 으로 컴파일됩니다 .
Cygwin 소개
Cygwin의 목적은 Unix 기반 운영 체제가 제공하고 POSIX 표준에 의해 문서화 된 많은 작은 세부 사항을 모방하여 Unix 기반 애플리케이션을 Windows로 훨씬 쉽게 포팅하는 것 입니다. 응용 프로그램은 파이프, 유닉스 스타일 파일 및 디렉토리 액세스 등과 같은 유닉스 기능을 사용할 수 있으며 Cygwin으로 컴파일 하여 응용 프로그램 주위 의 호환성 계층 으로 작동하여 많은 유닉스 관련 패러다임이 계속 사용됩니다.
소프트웨어를 배포 할 때 수신자는 Cygwin 런타임 환경 (파일에서 제공)과 함께 소프트웨어를 실행해야합니다 cygwin1.dll
. 소프트웨어와 함께 배포 할 수 있지만 소프트웨어는 해당 오픈 소스 라이센스를 준수해야합니다. 소프트웨어와 소프트웨어를 연결하고 dll을 개별적으로 배포하는 경우에도 오픈 소스 라이센스를 유지해야 할 수도 있습니다.
MinGW 소개
MinGW는 단순히 GCC, Make, Bash 등과 같은 GNU 컴파일러 도구의 Windows 포트가되는 것을 목표로합니다. 유닉스와의 모방 또는 포괄적 인 호환성을 제공하려고 시도하지 않고 대신 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 프레임 워크 는이 목적에 가장 인기있는 것으로, Windows를 포함한 운영 체제에서 작동하는 그래픽 응용 프로그램을 만들 수 있지만 다른 옵션도 있습니다. 처음부터 이러한 프레임 워크를 사용하는 경우 다른 플랫폼으로 이식 할 때 두통을 줄일 수있을뿐만 아니라 모든 플랫폼에서 동일한 그래픽 위젯 (창, 메뉴 및 컨트롤)을 사용할 수 있습니다. GUI 앱으로 사용자에게 기본적으로 표시되도록합니다.
Cygwin은 Windows에서 완전한 UNIX / POSIX 환경을 작성하려는 시도입니다. 이를 위해 다양한 DLL을 사용합니다. 이 DLL은 GPLv3 +에 포함되지만 라이센스에는 예외가 있습니다. 파생 작업이 GPLv3 +에 의해 적용되지 않는 가 . MinGW는 이러한 DLL에 의존하지 않고 Windows 실행 파일을 만들 수있는 C / C ++ 컴파일러 제품군입니다. 일반적인 Microsoft Windows 설치의 일부인 일반 MSVC 런타임 만 필요합니다.
MSYS 라는 MinGW로 컴파일 된 작은 UNIX / POSIX 환경을 얻을 수도 있습니다 . Cygwin의 모든 기능과 가까운 곳에는 없지만 MinGW를 사용하려는 프로그래머에게 이상적입니다.
다른 답변에 추가하기 위해 Cygwin은 MinGW 라이브러리 및 헤더와 함께 제공되며 gcc와 함께 -mno-cygwin 플래그를 사용하여 cygwin1.dll에 링크하지 않고 컴파일 할 수 있습니다. 나는 일반 MinGW와 MSYS를 사용하는 것을 선호합니다.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
Cygwin 패키지를 설치하십시오 . MinGW-64는 어색한 이름의 x86_64-w64-mingw32-gcc
명령 으로 사용할 수 있습니다 . 신 이시여, 누군가 이미이 피의 것들의 이름을 통일하십시오.
Cygwin 웹 사이트에서 :
- Cygwin은 Linux 용 Windows 환경입니다. 두 부분으로 구성되어 있습니다. DLL (cygwin1.dll)은 실질적인 Linux API 기능을 제공하는 Linux API 에뮬레이션 계층의 역할을합니다.
- Linux 모양과 느낌을 제공하는 도구 모음입니다.
Mingw 웹 사이트에서 :
MinGW ( "최소 Windows 용 최소 GNU")는 타사 C 런타임 DLL에 의존하지 않는 기본 Windows 프로그램을 생성 할 수 있도록 GNU 도구 세트와 결합 된 자유롭게 사용 가능하고 자유롭게 배포 가능한 Windows 고유 헤더 파일 및 가져 오기 라이브러리 모음입니다.
Cygwin과 MinGW의 차이점을 이해하려면 다음 질문에 대답하십시오.
질문 # 1 : 소스 코드를 한 번 작성하고 한 번 컴파일 한 다음 모든 플랫폼 (예 : Windows, Linux 및 Mac OS X…)에서 실행하는 응용 프로그램을 만들고 싶습니다.
답변 # 1 : 소스 코드를 JAVA로 작성하십시오. 소스 코드를 한 번 컴파일하고 어디서나 실행하십시오.
질문 # 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 용]) 표준을 사용해야합니다. 많은 고급 프로그래밍 기능과 도구를 제공합니다. 많은 운영 체제가 POSIX와 완전히 또는 부분적으로 호환됩니다 (Mac OS X, Solaris, BSD / OS 등). 공식적으로 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
는 drive와 연관된 현재 작업 디렉토리에 따라 해결됩니다 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
할 수 있습니다. gcc -mwindows
MinGW 및 Cygwin에서을 사용하여 콘솔 창을 필요로하지 않는 프로그램을 쉽게 만들 수도 있습니다 .
Cygwin은 POSIX가 아닙니다. Windows API에 대한 액세스를 제공 할뿐만 아니라 일부 Microsoft C 함수 ( msvcrt.dll
재배포 가능 msvcrtnn.dll
런타임에 있는 것)의 자체 구현도 제공합니다 . 예를 들면 다음 spawn*
과 같은 함수 군이 있습니다 spawnvp
. Cygwin 대신 fork
및 exec
Cygwin 에서 사용하는 것이 좋습니다 fork
. 개념이없는 Windows 프로세스 생성 모델에 더 잘 매핑되기 때문입니다 .
그러므로:
Cygwin 프로그램은 라이브러리 반주가 필요하다는 이유로 MS Visual C 프로그램보다 "기본"입니다. Windows에서 프로그래밍 언어 구현은 자체 런타임, 심지어 C 언어 구현도 제공해야합니다. Windows에는 공용으로 사용할 "libc"가 없습니다.
MinGW에 타사 DLL이 필요하지 않다는 사실은 실제로 단점입니다. 문서화되지 않은 Visual C 런타임의 Windows 내부 포크에 따라 다릅니다. MinGW는 GPL 시스템 라이브러리 예외가에 적용되기 때문에이 작업을 수행합니다. msvcrt.dll
즉, GPL 버전의 프로그램을 MinGW로 컴파일하고 재배포 할 수 있습니다.
msvcrt.dll
Cygwin은 POSIX 프로그램에 비해 훨씬 광범위하고 깊이있는 POSIX 지원으로 POSIX 프로그램 포팅에있어 최고의 환경입니다. 현재 LGPL에 속하므로 모든 종류의 라이센스 (오픈 소스 또는 비공개 소스)가있는 응용 프로그램을 재배포 할 수 있습니다. Cygwin은 VT100 에뮬레이션 및 termios
Microsoft 콘솔과 함께 작동합니다! tcsetattr
VT100 코드를 사용 하여 원시 모드를 설정 하고 커서를 제어하기 위해 POSIX 응용 프로그램 은 cmd.exe
창 에서 바로 작동합니다 . 최종 사용자와 관련하여 콘솔을 제어하기 위해 Win32 호출을 수행하는 기본 콘솔 앱입니다.
하나:
/bin/sh
및 기타 문제 에 의존 합니다. 이러한 차이점은 Cygwin 프로그램을 "비 기본"으로 만드는 것입니다. 프로그램이 경로를 인수로 사용하거나 대화 상자에서 입력하면 Windows 사용자는 해당 경로가 다른 Windows 프로그램에서와 동일한 방식으로 작동 할 것으로 기대합니다. 그래도 작동하지 않으면 문제입니다.플러그 : LGPL 발표 직후, Cygnal (Cygwin Native Application Library) 프로젝트를 시작 하여 Cygwin DLL 포크를 제공하여 이러한 문제를 해결했습니다. Cygwin에서 프로그램을 개발 한 다음 cygwin1.dll
재 컴파일하지 않고 Cygnal 버전으로 배포 할 수 있습니다 . 이 라이브러리가 향상됨에 따라 MinGW가 점차 없어 질 것입니다.
Cygnal이 경로 처리 문제를 해결하면 Cygnal과 함께 Windows 응용 프로그램으로 제공 될 때 Windows 경로와 작동하고 Cygwin /usr/bin
아래에 설치 될 때 Cygwin 경로와 완벽하게 작동하는 단일 실행 파일을 개발할 수 있습니다 . Cygwin에서 실행 파일은 다음과 같은 경로로 투명하게 작동 /cygdrive/c/Users/bob
합니다. Cygnal 버전의에 대해 연결하는 기본 배포에서는 cygwin1.dll
해당 경로가 의미가 없지만 이해 c:foo.txt
합니다.
위키 백과의 말 :
MinGW
의 버전 1.3.3에서 분기되었습니다Cygwin
. 모두 있지만Cygwin
및이MinGW
포트에 사용할 수있는UNIX
소프트웨어Windows
, 서로 다른 접근 방식을 가지고 :Cygwin
목표는 완전한 제공하기 위해POSIX layer
여러 시스템 호출 및에 존재하는 라이브러리를 에뮬레이션 제공하는Linux
,UNIX
그리고BSD
변형. 은POSIX layer
위에서 실행Windows
필요한 호환성을 위해 성능을 희생. 따라서이 방법을 사용하려면Windows
프로그램Cygwin
과 함께 프로그램과 함께 배포해야하는 카피 레프트 호환성 라이브러리 위에서 실행되도록 작성된 프로그램 이 필요 합니다source code
.MinGW
direct를 통해 기본 기능과 성능을 제공하는 것을 목표로합니다Windows API calls
. 같지 않은Cygwin
,MinGW
호환성 계층이 필요하지 않으므로DLL
프로그램을 배포 할 필요가 없습니다source code
.
MinGW
에 의존 하기 때문에Windows API calls
전체를 제공 할 수 없습니다POSIX API
. 로 컴파일UNIX applications
할 수있는 일부를 컴파일 할 수 없습니다Cygwin
. 특히이 필요로하는 응용 프로그램에 적용POSIX
등의 기능fork()
,mmap()
또는ioctl()
기대하는 사람들이에서 실행하고를POSIX environment
. 사용하여 작성된 응용 프로그램cross-platform library
자체에 이식되어 그MinGW
와 같은, 등이SDL
,wxWidgets
,Qt
, 또는GTK+
에서, 일반적으로 쉽게 컴파일MinGW
그들이에서하는 것처럼Cygwin
.컴퓨터의 레지스트리 나 파일에 항목을 남기지 않고 이동식 미디어에로드 할 수있는 소규모의 독립된 환경을 조합
MinGW
하여MSYS
제공합니다.Cygwin
휴대용은 비슷한 기능을 제공합니다. 더 많은 기능을 제공함으로써Cygwin
설치 및 유지 관리가 더욱 복잡해집니다.그것은 할 수도 있습니다
cross-compile Windows applications
로MinGW-GCC under POSIX systems
. 이는 개발자가 없이MSYS
실행되는 소프트웨어를 컴파일하기 위해 Windows를 설치할 필요가 없음을 의미합니다 .Windows
Cygwin
Windows에서 Unix 응용 프로그램을 컴파일 할 수 있도록 설계된 AT & T의 U / Win 소프트웨어 (과거 버전-2012-08-06; Eclipse Public License, 버전 1.0 사용)를 간과하지 마십시오 .
Cygwin과 마찬가지로 그들은 라이브러리에 대해 실행해야합니다. 그들의 경우에 POSIX.DLL
. AT & T 직원들은 훌륭한 엔지니어들 (ksh와 dot 을 가져간 동일한 그룹 )이며 그들의 물건은 체크 아웃 할 가치가 있습니다.
Cygwin은 전체 POSIX 환경을 에뮬레이션하지만 MinGW는 컴파일 전용의 최소한의 도구 세트입니다 (기본 Win 응용 프로그램을 컴파일합니다).
Windows에서는 VS를, Linux / Unices에서는 GCC를 사용하는 것이 좋습니다. 대부분의 오픈 소스 프로젝트가이를 수행합니다 (예 : Firefox 또는 Python).
clang
실행 가능한 크로스 플랫폼 솔루션이라는 것입니다.
유틸리티 동작은 둘 사이에서 실제로 다를 수 있습니다.
예를 들어 Cygwin tar는 fork ()가 mingw 버전이 지원하지 않는 DLL에서 지원되기 때문에 포크 할 수 있습니다. 이것은 소스에서 mysql을 컴파일하려고 할 때 발생하는 문제입니다.
상용 / 독점 / 비 오픈 소스 응용 프로그램에서 Cygwin을 사용하려면 Red Hat 의 " 라이센스 구매 "를 위해 수만 달러를 지불해야합니다 . 이는 상당한 비용으로 표준 라이센스 조건 을 무효화합니다 . 구글 "cygwin 라이센스 비용"과 처음 몇 가지 결과를 참조하십시오.
mingw의 경우 그러한 비용이 발생하지 않으며 라이센스 (PD, BSD, MIT)는 매우 허용됩니다. 대부분에서 당신은 할 수있다 mingw64-TDM을 사용하는 경우 winpthreads이 라이센스가 필요합니다 같은 응용 프로그램과 함께 라이센스 세부 사항을 제공 할 것으로 예상된다.
Izzy Helianthus 덕분에 편집 : Cygwin의 winsup 서브 디렉토리에있는 API 라이브러리 가 이제 전체 GPL과는 달리 LGPL 로 배포 되므로 상업용 라이센스를 더 이상 사용할 수 없거나 필요하지 않습니다 .
Cygwin은 본격적인 Linux와 같은 플랫폼을 제공하도록 설계된 광범위한 도구 세트를 포함하여 Windows에보다 완벽한 POSIX 환경을 제공하도록 설계되었습니다. 비교,는 MinGW와 MSYS는 경량을 제공, 미니멀 POSIX 같은 같은 단지 더 중요한 도구 층 gcc
및 bash
가능합니다. MinGW의보다 미니멀 한 접근 방식으로 Cygwin이 제공하는 POSIX API 적용 범위를 제공하지 않으므로 Cygwin에서 컴파일 할 수있는 특정 프로그램을 빌드 할 수 없습니다.
Cygwin 툴체인은이 둘에 의해 생성 된 코드 측면에서 대규모 런타임 라이브러리에 대한 동적 링크에 의존하는 cygwin1.dll
반면, MinGW 툴체인은 코드를 Windows 네이티브 C 라이브러리에 동적으로 링크하고 바이너리의 msvcrt.dll
일부에 정적으로 링크하는 바이너리로 코드를 컴파일합니다 glibc
. Cygwin 실행 파일은 더 작지만 별도의 재배포 가능 DLL이 필요하지만, MinGW 바이너리는 독립형으로 제공 될 수 있지만 더 큰 경향이 있습니다.
Cygwin 기반 프로그램을 실행하려면 별도의 DLL이 필요하다는 사실은 라이센스 제한으로 이어집니다. Cygwin 런타임 라이브러리는 OSI 호환 라이센스가있는 애플리케이션에 대한 링크 예외를 제외하고 GPLv3에 따라 라이센스가 부여되므로 Cygwin을 중심으로 비공개 소스 애플리케이션을 구축하려는 개발자는 Red Hat으로부터 상용 라이센스를 취득해야합니다. 반면 MinGW 코드는 헤더와 라이브러리가 허가되어 있으므로 오픈 소스 및 폐쇄 소스 응용 프로그램 모두에서 사용할 수 있습니다.
Cygwin 은 Unix와 유사한 환경 및 Microsoft Windows 용 명령 줄 인터페이스입니다.
Mingw 는 GCC (GNU Compiler Collection)의 Microsoft 소프트웨어 용 기본 소프트웨어 포트이며 Windows API 용 무료 배포 가능 가져 오기 라이브러리 및 헤더 파일 세트와 함께 제공됩니다. MinGW를 통해 개발자는 기본 Microsoft Windows 응용 프로그램을 만들 수 있습니다.
필요한 모든 라이브러리 (DLL)가있는 경우 환경 mingw
없이 생성 된 바이너리를 실행할 수 있습니다 cygwin
.
Cygwin
호환성 계층을 사용하지만 MinGW
기본입니다. 이것이 주요 차이점 중 하나입니다.