• 개인적으로 cygwin+mingw32+boost+SDL+directx+opengl+ACE기반에서 작업을 합니다. :) 그래서 여기에 요약을 해봅니다.

[�몄쭛]

링크 및 아티클 #

[�몄쭛]

#

  • cygwin 기본 패키지 외의 다른 라이브러리들을 설치할 경우(예 : SDL), autoconf를 지원하는 소스배포본이면 ./configure를 다음과 같이 실행해야합니다.
    ./configure --prefix=/usr/local
    이것은 라이브러리의 모든 결과화일이 /usr/local/include, /usr/local/lib로 들어가도록 해줍니다. (다른 ./configure들도 모두 --prefix=/usr/local를 붙여 실행하는 것이 좋습니다. 이것은 패키지 배포본은 /usr/include, /usr/lib에, 개인적으로 autoconf로 설치한것은 /usr/local 아래에 설치되게 됩니다.)
  • cygwin에서 directx를 사용할 수 있습니다. (SDL 설치시 directdraw wrapper를 사용하시려면 필수가 되겠죠) w32api 패키지를 설치하면 기본적으로 dx관련 라이브러리 화일들이 설치되지만, 아쉽게도 헤더화일은 배포본에 포함되어있지 않은 것을 알수 있습니다. (아마도 저작권 문제지 않을까...)
    1. [http]Directx SDK 8.0a를 다운 받습니다. (100메가가 조금 넘습니다. :( ) -> 여기에서 아래 헤더화일만 복사한 것 입니다. @w32api_dx8a_headers.zip (103.63 KB)
    2. 알집같은 것으로 열어서 include 디렉토리에서 ddraw.h, dinput.h, dsound.h d3dtypes.h를 /usr/include/w32api에 복사합니다. (/lib/w32api에 보면 d3d관련으로 추측되는 라이브러리들이 있습니다. 아마도 8.0까지 지원하는 것 같은데... 확실하지 않아서리...누가좀 알려주세요.. :) )
    3. 끝입니다. SDL과 같은 라이브러리를 컴파일 해봅니다. (./configure만 해봐도 directx header and library = yes 로 되는 것을 알 수 있습니다.)

[�몄쭛]

MinGW를 Cygwin과 사용하려면? #

cygwin으로 컴파일한 실행화일은 항상 cygwin1.dll을 필요로 합니다. 헌데, 이 dll을 포함한 어플리케이션은 상용으로 판매하려면 redhat사로부터 라이센스를 구입해야하므로 회사에서 쓰기에는 참 깝깝해지죠. 그래서 mingw 배포본에 포함된 gcc 및 binutil을 사용하여 컴파일하는 방법도 존재하지만, cygwin의 막강하고 깔끔한 bash 에뮬 개발환경이 부럽게 됩니다. 다음은 cygwin에서 mingw를 사용하여 "라이센스로부터 해방된" 실행화일을 만들기위한 설정들입니다.

[�몄쭛]

첫번째 방법 : 같이 깔기 #

cygwin 개발환경을 사용하려고 하고 cygwin 독립적인 실행화일을 생성하고자 하는데 있어서, "-mno-cygwin"보다 더 간단한 방법이 존재합니다. 단지 Cygwin과 Mingw 배포본을 각각 별도의 디렉토리(예를 들면 "C:\CYGWIN"과"C:\MINGW")에 설치한 후, 여러분의 PATH 환경변수에서 Mingw 설치 디렉토리의 /bin 디렉토리를 cygwin 설치 디렉토리의 /bin보다 앞에 오게 설정합니다. (예를 들면, "PATH=%PATH%;C:\MINGW\BIN;C:\CYGWIN\BIN"). 이것은 원하는 모든 UNIX 툴을 이용할 수 있으면서 gcc는 mingw 버전을 사용하는 것을 보장합니다. (어~ 알고 있는데~ 하시는 분은 그냥 넘어가시길... :) )

cygwin상의 "/etc/profile"화일안을 보면 시스템 수준의 경로가 "/usr/local/bin", "/usr/bin", "/bin" 순으로 지정되어있다는 것을 명심하시기 바랍니다. 따라서, 윈도우즈 경로를 설정한 것으로는 충분하지 않습니다... 즉, cygwin 환경내에서도 mingw /bin 경로가 앞에 설정되도록 수정해야합니다. ("/etc/profile"을 수정하거나 수동으로 설정하는지 선택하시기 바랍니다).

[�몄쭛]

두번째 방법 : gcc-mingw32 패키지 이용하기 #

앞의 방법은 몇몇 라이브러리에서는 충돌이 일어납니다. (순수 ANSI C 기반이라면 괜찮지만, win32용 개발이거나 directx관련 코드 컴파일시에는 문제가 생기더군요.) 그래서, redpixel은 다음과 같은 방법을 추천합니다. (한달전에 약 2일정도에 걸친 엄청난 삽질을 통해 알아냈지만 의외로 방법은 간단하더군요.)

우선 gcc-mingw32 패키지를 cygwin setup을 통하여 설치합니다. 그런다음 /usr/include/mingw와 /usr/lib/mingw 디렉토리가 생겼는지 확인합니다.

끝입니다. :) 이제부터는 모든 컴파일, 링크때마다 항상 gcc, g++ 뒤에 --target=i686-pc-mingw32 -mno-cygwin 옵션을 붙이면 mingw로 컴파일됩니다. 여기에 주의할 점은 반드시 gcc 다음에 이어서 적어야한다는 점이며, 가급적 패키지가 아닌 라이브러리들은 /usr/local 위에 설치해야한다는 점입니다. (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는 호환이 되질 않더군요.

[�몄쭛]

세번째 방법 : gcc-mingw 패키지 -> mingw32 전체 복사 #

앞서의 방법에 대한 보충입니다. 두번째 방법과 같이 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에서 빌드해서 사용하는 것이 좋습니다.

부디 제가 겪었던 삽질이 줄어들길 바랍니다. :)

==> http://www.redwiki.net/wiki/wiki.php/Cygwin 참조

'It's Code' 카테고리의 다른 글

FILE IO  (0) 2008.09.08
리눅스 커널 소스 디렉토리  (0) 2007.08.17
리눅스 커널 소스 (The Linux Kernel Sources)  (0) 2007.08.17
Java classpath 관리하기  (0) 2007.08.16
JAVAScript TIP  (0) 2007.08.10

+ Recent posts