C ++ 프로젝트를 크로스 플랫폼으로 만들고 싶습니다. Cygwin / MinGW 사용을 고려하고 있습니다. 그러나 그들 사이의 차이점은 무엇입니까?
또 다른 질문은 Cygwin / MinGW없이 시스템에서 바이너리를 실행할 수 있는지 여부입니다.
답변
간단히 말하면 다음과 같습니다.
-
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를 사용하는 것을 선호합니다.
답변
Cygwin 웹 사이트에서 :
- Cygwin은 Linux 용 Windows 환경입니다. 두 부분으로 구성되어 있습니다. DLL (cygwin1.dll)은 실질적인 Linux API 기능을 제공하는 Linux API 에뮬레이션 계층의 역할을합니다.
- Linux 모양과 느낌을 제공하는 도구 모음입니다.
Mingw 웹 사이트에서 :
MinGW ( “최소 Windows 용 최소 GNU”)는 타사 C 런타임 DLL에 의존하지 않는 기본 Windows 프로그램을 생성 할 수 있도록 GNU 도구 세트와 결합 된 자유롭게 사용 가능하고 자유롭게 배포 가능한 Windows 고유 헤더 파일 및 가져 오기 라이브러리 모음입니다.
답변
Cygwin은 DLL cygwin.dll (또는 DLL 세트)을 사용하여 Windows에서 POSIX와 유사한 런타임을 제공합니다.
MinGW는 기본 Win32 응용 프로그램으로 컴파일됩니다.
Cygwin으로 무언가를 빌드하는 경우, 설치하는 시스템에는 Cygwin DLL도 필요합니다. MinGW 응용 프로그램에는 특별한 런타임이 필요하지 않습니다.
답변
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 호환 개발 및 런타임 환경을 제공합니다.
그러므로:
Windows에서 GCC 크로스 플랫폼 컴파일러를 활용하려면 MinGW를 사용하십시오.
Windows에서 POSIX 표준 고급 프로그래밍 기능 및 도구를 이용하려면 Cygwin을 사용하십시오.
답변
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 호출을 수행하는 기본 콘솔 앱입니다.
하나:
- Cygwin은 기본 Windows 개발 도구로서 Windows와는 다른 경로 처리와 같은 하드 코딩 된 경로
/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
합니다.