본문 바로가기

Major Field/GNU Environment

MinGW? MSYS? Cygwin?

반응형

MinGW or Mingw32 (Minimalist GNU for Windows)


Win32 플랫폼에 대한 GNU 툴체인소프트웨어 포트이다.  MinGW는 일단의 native Win32개발을 위한 윈도우즈 헤더파일(W32API)들을 포함한다.  이것은 원래 Cygwin (version 1.3.3)으로 부터 출발했다.

MinGW는 종종 구성(configure) 스크립트의 실행을 가능케 하고 POSIX기능을 지원하는 가벼운 쉘환경을 제공하기 위하여 Cygwin기반의 패키지인 MSYS(Minimal SYStem)와 함께 사용된다.

Cygwin이나 MinGW나 둘 다 유닉스 소프트웨어를 윈도우즈로 포팅하는데 사용되지만 이들은 서로 다른 접근을 하고 있다.  Cygwin은 호환성을 유지하기 위하여 성능을 희생하면서 까지 윈도우즈상에 완전한 POSIX계층을 제공하는 것이 목표이고 반면에 MinGW는 성능을 우선으로 하는 공개 컴파일러와 툴체인을 제공하는 것이 목표이다.

Cygwin과는 달리 MinGW는 호환성 계층 DLL을 요구하지 않으며 permissive license를 따른다.

MinGW는 POSIX API를 제공하지 않기 때문에 Cygwin으로 컴파일되는 몇몇 유닉스 프로그램을 컴파일하지 못한다.  특정 POSIX기능을 요구하고 POSIX 환경에서 실행되어야 하는 프로그램들이 그렇다.  플랫폼에 의존하지 않는 라이브러리를 사용하도록 씌여진 응용프로그램인 SDL, wxWidgets, Qt, 또는 GTK+는 Cygwin에서 처럼 MinGW에서도 쉽게 컴파일된다.

Cygwin으로 컴파일한 실행파일은 항상 cygwin1.dll을 필요로 한다. 이 dll을 포함한 어플리케이션은 상용으로 판매하려면 Redhat사로부터 라이센스를 구입해야 하는 문제가 있다.
Cygwin에서 MinGW를 사용하여 "라이센스로부터 해방된" 실행파일을 만들기 위한 몇 가지 설정들은 다음과 같다.

1. Cygwin과 MinGW를 각각 별도의 디렉토리에 설치한 후, Path 환경변수에서 MinGW 설치 디렉토리의 bin 디렉토리를 Cygwin 설치 디렉토리의 bin 보다 앞에 오게 설정한다.
Cygwin상의 "/etc/profile" 파일을 보면 시스템 수준의 경로가 "/usr/local/bin", "/usr/bin", "/bin" 순으로 지정되어 있다. 따라서 Windows 경로를 설정한 것으로는 충분하지 않다. Cygwin 환경에서도 MinGW의 bin 경로가 앞에 설정되도록 수정해야 한다.
Cygwin에서 "/etc/profile" 파일을 수정하면 된다.(win32용 개발이거나 DirectX 관련 코드 컴파일시에 충돌이 일어나는 경우가 있다.)

2. gcc-mingw32 패키지를 Cygwin Setup을 통하여 설치한다. 그리고 /usr/include/mingw 와 /usr/lib/mingw 디렉토리가 생겼는지 확인한다.
이제 모든 컴파일, 링크시마다 항상 gcc, g++ 뒤에 --target=i686-pc-mingw32 -mno-cygwin 옵션을 붙이면 MinGW로 컴파일된다. 주의할 점은 반드시 gcc 다음에 이어서 적어야 한다는 점이며 가급적 패키지가 아닌 라이브러리들은 /usr/local 위에 설치해야한다.
우선 gcc-mingw32 패키지를 cygwin setup을 통하여 설치합니다. 그런다음 /usr/include/mingw와 /usr/lib/mingw 디렉토리가 생겼는지 확인합니다.
(autoconf기반의 프로젝트라면 ./configure --target=i686-pc-mingw32 라고 적으면 mingw기반의 makefile을 만들어 낸다.)

cygwin1.dll을 사용하지 않는다는 것을 알려면 다음과 같이 하면 된다.

objdump -p 컴파일된실행화일명 | grep "DLL Name"

그러면 다음과 비슷한 출력이 나온다.

       DLL Name: msvcrt.dll
       DLL Name: msvcrt.dll
       DLL Name: KERNEL32.dll

여기에 cygwin1.dll이 껴있으면 mingw를 사용하지 않고 cygwin기반으로 컴파일되었다는 뜻이다. 주의할 점은 이렇게 컴파일해서 실행하려면, 템플릿 기반인 boost같은 라이브러리를 제외하고는 모든 /usr/local 아래에 있는 사용자 라이브러리들을 재컴파일 해서 사용해야만 합니다. 즉, mingw32기반의 obj코드와 cygwin기반의 obj는 호환이 되질 않는다.

3. (2)의 방법과 같이 gcc-mingw 패키지를 설치하고 mingw32 배포본도 적당한 디렉토리에 설치한다. 그 다음에는 다음과 같이 모든 mingw 라이브러리와 헤더파일을 복사한다.

cp /cygdrive/c/mingw/include /usr/include/mingw
cp /cygdrive/c/mingw/lib /usr/lib/mingw
중간에 gl 디렉토리 관련해서 복사를 못한다고 나오면, /usr/include/mingw 디렉토리에 있는 gl디렉토리 하드링크를 삭제하고 복사하면 된다. 조금 귀찮긴 하지만 이렇게 하면 컴파일할때 -mno-cygwin 옵션만 붙이면 완벽히 cygwin 독립적인 코드가 생성된다.

자신의 라이브러리를 빌드할 생각이라면 MSYS + MinGW32를 설치하고 여기서 빌드한 후 /usr/local로 복사해 사용하는 방법도 좋다. msys 배포본에도 autotool은 지원하지 않지만 gmake는 지원하고 있고 위와 같이 cygwin을 설치하면 완전히 mingw와 호환된다.
SDL같은 경우는 cygwin에서 그냥 빌드해도 cygwin1.dll에 대한 의존성이 없도록 빌드하지만, 대부분의 오픈소스 라이브러리들(ACE조차도!)은 가급적 msys에서 빌드해서 사용하는 것이 좋다.



반응형