MSYS2

MSYS2와 GCC를 설치하는 방법

MSYS2
Photo by Galina Nelyubova / Unsplash

윈도 환경에서 C로 작성된 소스코드를 컴파일하려면 Visual Studio를 쓰거나 다른 컴파일러를 구성하는 두 가지 선택지가 있습니다. 개인적으로는 Visual Studio는 선호하지 않습니다. 뭐가 너무 많이 설치되는데다가 설치 위치도 내가 결정할 수 없어서 C드라이브 용량이 빠듯한 상황이면 선뜻 설치할 수 조차 없습니다. 그리고 굳이 무거운 IDE를 같이 쓰고 싶지도 않고요.

다른 선택은 gcc를 사용하는 것입니다. 하지만 gcc는 원래 리눅스/유닉스 계열을 위한 컴파일러 컬렉션이며, 윈도에서 이를 사용하기 위해서는 윈도용으로 이식된 버전을 사용해야 합니다.

그런데 '컴파일러의 이식'이란 단순히 컴파일러를 다른 시스템에서 구동가능한 형태로 빌드하는 것을 의미하지는 않습니다. 소스코드가 참조해야 하는 표준 라이브러리 및 시스템 라이브러리가 해당 플랫폼에 맞게 같이 이식되거나, 인터페이스가 조정되어야 한다는 뜻이죠.

또한 오픈소스 프로그램들은 빌드에 있어 단순히 컴파일러 뿐만 아니라 다른 도구들도 함께 필요한 경우가 많기 때문에 gcc 단독으로 설치하는 것으로 완전한 컴파일러 세트를 사용할 수 있는 것이 아닙니다.

이를 해결하는 방법에 따라서 다시 두 가지 솔루션이 있는데, 먼저 Cygwin은 POSIX를 윈도에서 에뮬레이트하는 레이어를 사용하는 것으로 리눅스용 프로그램이 윈도에서 그대로 빌드되고 실행될 수 있습니다. (대신 실행할 때에도 cygwin환경이 필요함) 다른 방법으로는 호환성은 포기하고, gcc만 윈도에서 실행할 수 있도록 최소한의 도구들을 같이 윈도로 포팅하는 것입니다.

MSYS는 여기에 해당하는 프로젝트입니다. 리눅스용 명령줄 프로그램들과 bash 쉘을 윈도용으로 포팅하여 사용할 수 있게 해주는 것이죠. 예전에는 MSYS와 MinGW를 각각 설치하여 윈도에서 gcc를 사용할 수 있었는데요, 32비트까지만 지원이 되고, 64비트 부터는 MSYS2를 사용합니다. MSYS2를 설치하면 자체 쉘에서 패키지 관리자인 pacman을 사용해서 gcc나 clang을 설치할 수 있습니다.

MSYS2를 설치하고나면 전용 쉘 창이 열리는데, 이곳에서 pacman -S 명령을 사용해서 필요한 패키지를 설치할 수 있습니다.

MSYS2 홈페이지에서는 UCRT환경에서 gcc를 설치하는 예시를 보여주고 있는데, 이 상하게 UCRT에서는 Gvim이 빌드가 안돼서, mingw-w64 환경을 설치합니다.

pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-make

...

# clang을 설치하고 싶다면
pacmna -s mingw-w64-x86_64-clang
...

# toolchain을 설치해야하는 프로젝트를 빌드한다면
pacman -S mingw-w64-x86_64-toolchain

x86_64

만약 msys 창을 사용하지 않고 일반 터미널 환경(cmd.exe)에서도 이러한 도구를 사용하고 싶다면 다음 경로를 PATH에 추가해줍니다. 맨 앞쪽에 추가해주는 것이 좋습니다.

* C:\msys64\usr\bin
* C:\msys64\mingw64\bin

> SET PATH=C:\msys64\user\bin;C:\msys64\uctr64\bin;%PATH

물론 맨 아래 명령은 일회성일 뿐, 환경 변수를 영구적으로 수정하지 않습니다.

MSYS2 내부가 아닌 시스템에 설치된 파이썬, 루아 런타임을 이용하기 위해서, 저는 일반 환경에서 MSYS2도구만 PATH에 등록해서 vim을 빌드하고 있습니다.

그 외에 설정이 필요한 환경 변수

PATH는 여러 도구를 실행하기 위해 당연히 설정해야 하는 환경변수이지만, 그 외에도 GCC의 동작에 영향을 주는 몇 가지 환경 변수들이 있습니다.

  • GCC_EXEC_PREIFX : gcc가 다른 서브 프로그램들을 사용할 때 앞에 붙이는 접두어. 접두어는 경로가 될 수도 있음.
  • COMPLIER_PATH : gcc가 다른 서브 프로그램들을 찾기 위해 찾아보는 경로
  • LIBRARY_PATH : gcc가 -L옵션으로 지정하지 않더라도 라이브러리 파일을 찾기 위해 탐색하는 경로들.
  • C_INCLUDE_PATH : gcc가 include 하는 파일들을 찾기 위해 탐색하는 경로들.
Environment Variables (Using the GNU Compiler Collection (GCC))
Environment Variables (Using the GNU Compiler Collection (GCC))

gcc에 영향을 주는 모든 환경 변수는 공식 문서를 참고합시다.