Cygwin이란 무엇인가?
윈도우와 리눅스는 구조적으로 매우 다른 운영체제이기 때문에, 한쪽에서 작성된 프로그램을 다른 쪽으로 포팅하는 일은 결코 쉽지 않습니다. 특히 GUI 프로그램의 경우 더욱 그렇습니다. 크로스 플랫폼 라이브러리와 SDK가 많이 존재하지만, 이식성을 고려하지 않고 작성된 네이티브 프로그램은 포팅하기가 상당히 까다롭습니다.
리눅스용으로 작성된 프로그램을 윈도우에서 컴파일하고 실행해야 한다면 Cygwin이라는 강력한 해결책이 있습니다. Cygwin 프로젝트는 배시 셸과 GNU 컴파일러 체인을 포함해 윈도우에서 가장 널리 쓰이는 도구와 컴파일러를 모아 놓은 컬렉션입니다. 또한 리눅스 전용 API를 호출하는 프로그램도 컴파일할 수 있도록 호환성 계층 역할을 하는 라이브러리를 함께 제공합니다. 단, Cygwin은 에뮬레이터나 가상 머신이 아니므로, 리눅스 바이너리를 재컴파일 없이 윈도우에서 곧바로 실행할 수 있게 해주는 도구는 아니라는 점을 기억하세요.
Cygwin 설치하기
Cygwin 공식 설치 페이지에 접속해 사용 중인 윈도우 버전에 맞는 32비트 또는 64비트 셋업 실행 파일을 다운로드합니다. 셋업 프로그램을 실행한 뒤 "다음(Next)"을 두 번 클릭해 "Install from Internet" 옵션을 선택합니다. 기본 설치 경로는 "C:\cygwin"이며, 변경도 가능하지만 특별한 이유가 없다면 기본값을 그대로 사용하는 것이 좋습니다. 이후 "다음" 버튼을 세 번 연속해서 클릭합니다.
필수 패키지 선택하기
Cygwin 프로젝트는 전 세계에 미러 사이트를 운영하고 있습니다. 자신의 위치에서 가장 빠르게 접속할 수 있는 미러를 고른 뒤 "다음"을 클릭합니다. 이제 설치할 패키지를 선택해야 하는데, 윈도우에서 간단한 리눅스 프로그램을 컴파일하려면 C/C++ 컴파일러를 제공하는 GNU 컴파일러 체인(GCC)이 반드시 필요합니다.

검색창에 "gcc"를 입력하고 패키지 목록에서 "Devel" 항목 옆의 작은 더하기(+) 기호를 클릭합니다. "gcc-core"와 "gcc-g++"를 찾아 각각 "Skip"을 클릭하면, 글자가 버전 번호로 바뀌고 "Bin?" 열의 "n/a" 표시가 체크박스로 전환됩니다. 같은 방식으로 "make"를 검색해 "Devel" 아래의 "make"를 설치 대상으로 표시하고, "wget"도 검색해 "Web" 카테고리에서 설치하도록 선택합니다. 아래 예제를 빌드하려면 "libiconv"도 필요하니 함께 검색해 설치 목록에 추가합니다.

"다음"을 클릭하면 설치 프로그램이 의존성을 해결하기 위해 추가로 필요한 패키지를 자동으로 확인합니다. 권장 사항을 수락하려면 "다음"을 한 번 더 누릅니다.
모든 패키지의 다운로드와 설치가 끝나면 마지막 단계를 마쳐 설치 프로그램을 종료합니다. 이제 "Cygwin Terminal"을 실행하면 리눅스와 유사한 개발 환경에 진입할 수 있습니다. 터미널에서는 "dir" 같은 윈도우 명령어 대신 "ls" 같은 셸 명령어를 사용한다는 점에 유의하세요.
실전 예제: W3C HTML-XML-utils 빌드하기
윈도우에서 리눅스 프로그램을 컴파일하는 전 과정을 보여드리기 위해 W3C의 HTML-XML 패키지를 사용해 보겠습니다. 이 도구로 어떤 작업을 할 수 있는지 궁금하다면 "명령줄에서 HTML·XML 파일 다루기" 관련 자료를 참고하시기 바랍니다.
먼저 "wget"으로 소스 파일을 다운로드합니다:
wget https://www.w3.org/Tools/HTML-XML-utils/html-xml-utils-6.7.tar.gz
다운로드한 압축 파일의 압축을 풉니다:
tar -zxf html-xml-utils-6.7.tar.gz
소스 파일이 "html-xml-utils-6.7" 디렉터리에 풀립니다. 해당 디렉터리로 이동합니다:
cd html-xml-utils-6.7
본격적인 빌드에 앞서, 현재 빌드 환경에 맞는 Makefile(빌드 지침 파일)을 생성하기 위해 "configure" 셸 스크립트를 실행해야 합니다. 이는 리눅스뿐 아니라 Cygwin에서도 소스 기반 패키지를 빌드할 때 거치는 표준적인 단계입니다.
./configure

"configure"가 완료되면 "make"를 입력해 빌드를 시작합니다:
make
빌드 오류 해결하기
빌드는 중간에 실패하게 됩니다. 다른 프로젝트로 갈아타거나 HTML-XML-utils 빌드를 끝까지 붙잡고 갈지 고민했지만, 여기서는 후자를 택했습니다. Cygwin에서 리눅스 프로그램을 컴파일하는 일이 언제나 순탄하지만은 않다는 사실을 보여주는 좋은 예이기 때문입니다. 다행히 이 문제의 해결법은 의외로 간단합니다. 오류 메시지를 보면 링커가 "iconv" 라이브러리를 찾지 못한다고 나오는데, 링크 명령을 살펴보면 해당 라이브러리가 지정조차 되어 있지 않습니다. 가장 빠른 임시방편은 명령을 직접 실행하면서 링커에게 libiconv를 사용하라고 알려주는 것입니다. 물론 "정석적인" 해결 방법은 Makefile 등을 분석해 근본 원인을 찾아내는 것입니다.

다음 명령을 실행합니다. 끝에 "-liconv"가 추가된 점에 주목하세요:
gcc -g -O2 -o hxindex.exe hxindex.o scan.o html.o openurl.o url.o heap.o class.o errexit.o connectsock.o types.o tree.o genid.o dtd.o headers.o dict.o fopencookie.o -liconv
"hxindex.exe" 파일이 성공적으로 빌드되면 다시 "make"를 입력해 나머지 빌드를 이어갈 수 있습니다. "make"는 이미 빌드된 항목과 아직 빌드되지 않은 항목을 확인한 뒤 적절한 지점부터 작업을 재개합니다. 우리가 "hxindex.exe"를 수동으로 만들었기 때문에, "make"는 목록상의 다음 바이너리부터 자연스럽게 이어서 처리합니다.
"make"가 완료되면 html-xml-utils-6.7 디렉터리 안에 모든 .exe 실행 파일이 생성된 것을 확인할 수 있습니다.
문제 발생 시 참고 자료
Cygwin 사용 중 막히는 부분이 있다면 공식 FAQ와 문서를 먼저 확인해 보세요. 그래도 해결되지 않으면 프로젝트에서 운영하는 메일링 리스트를 활용할 수 있습니다. 위에서 안내한 단계를 진행하다 문제가 생겼다면 아래 댓글로 알려주세요.