2014/04/18 16:33

MinGW-w64 library들 설치하기-0 Programming

OpenSceneGraph를 MinGW 64bit 환경에서 새로 빌드해야 하는데, OSG가 쓰는 3rd party 라이브러리들은 별도로 다운받아 설치해야 한다.

그런데 이미 visual studio로 빌드된 바이너리들은 보이는데, MinGW로 빌드된 것은 못찾겠다.

일일히 빌드해야 할 판... 마침 다음의 사이트가 보여 이걸 가이드 삼아 그대로 따라해보기로 한다.
여기에 보니 msys make 빌드에 필요한 find.exe가 mingw-w64 distribution에 없으므로 mingw32용 msys distribution에 있는 find.exe를 복사해 넣으란다.

우선 빌드 전에 MinGW가 사용하는 디폴트 include 및 lib 디렉토리를 설정할 필요가 있을 듯.
요건 MinGW.org에 있는 다음의 페이지들에서 도움을 받는다.
위의 내용에 의하면 gcc specs 파일을 사용하거나, 환경변수를 셋업하여 사용하는 두가지 방법이 가능한데,
StackOverflow의 Q&A를 참조해보니 환경변수를 이용하는 것이 좋을 것 같아서 이렇게 가보기로 한다.

필요한 환경 변수 후보들은 대략 다음과 같다.
  • CPATH
  • C_INCLUDE_PATH
  • CPLUS_INCLUDE_PATH
  • LIBRARY_PATH
참고로 include 환경변수들은 -I 옵션으로 주어진 디렉토리들 다음으로 점검되는데, 이들 중 CPATH는 C/C++ 공통으로 검색되는 경로라고 한다.  어차피 C와 C++  따로 쓸 일은 없을 것 같아서 다음과 같이 두 가지 환경변수만 쓰기로 했다.
이들을 msys 설치된 디렉토리에 .bashrc 파일을 만들고 그 안에 집어 넣었다.
  • export CPATH=/D/PTT/Libraries/mingw/w64/include
  • export LIBRARY_PATH=/D/PTT/Libraries/mingw/w64/lib
그런데 msys.bat으로 shell을 띄우면 .bashrc 대신, 다음의 순서대로 etc/profile과 ~/.profile을 필요로 한다는걸 알게 되었다.
그래서 msys의 home 디렉토리(msys/home/유저네임)에 .profile 파일을 만들고 거기에 위의 경로를 추가하였다.

앞으로 msys의 make를 통해 빌드하게 될 텐데, 위의 경로가 /usr/local에 맵핑되도록 msys/etc/fstab파일 또한 수정했다.
  • D:/PTT/Tools/TDM-GCC-64 /mingw
  • D:/PTT/Libraries/mingw/w64 /usr/local
또한, 나중에 알게 되었는데, NetBeans C++ 프로젝트를 만들 때 매번 include 와 라이브러리 경로를 지정하지 않으려면 아래 그림과 같이 CPATH 및 LIBRARY_PATH 환경변수 설정이 필요하다.  아래는 EnvMan으로 설정한 화면. 그 외 OSG (OpenSceneGraph) 및 User Path 환경변수 값들도 보인다.


이제 다시 처음으로 돌아가서 MinGW 64 환경에 필요한 라이브러리 구축하기 가이드를 참조하여, 가장 먼저 zlib을 다운받아 설치해본다.  이게 비교적 설치가 간단해보이고, 이런 저런 라이브러리가 많이 참조하는 터라, 먼저 골라봤다.

1. zlib
  • cd /usr/local
  • wget http://zlib.net/zlib-1.2.8.tar.gz
  • tar xvzf zlib-1.2.8.tar.gz
  • cd zlib-1.2.8
  • make -f win32/Makefile.gcc
   오류 없이 잘 빌드되었다.  이어서 가이드에 있는대로 생성된 파일들을 해당 디렉토리에 복사까지 완료.
  • cp zlib1.dll /usr/local/bin
  • cp zconf.h zlib.h /usr/local/include
  • cp libz.a /usr/local/lib
  • cp lib.zdll.a /usr/local/lib/libz.dll.a
   이제 다시 /usr/local로 돌아와서 나머지 라이브러리들도 설치해본다.

2. libiconv
       가이드에는 --host 옵션을 주었지만, configure가 warning을 준다. 그래서 --build로 바꿔 진행했다.  
       또한 버젼 1.14로 빌드해보려 했는데, 이 버젼은 relocatable 옵션을 주면 빌드 에러가 발생한다.
       관련 patch를 받아 적용하면 될 거 같은데, 포기하고, 가이드대로 libiconv-1.13.1을 다운받아 빌드하였다.
    • cd /usr/local
    • wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
    • tar xvzf libiconv-1.13.1.tar.gz
    • cd libiconv-1.13.1
       가이드의 configure 명령에 thread와 relocatable 옵션을 추가하고, install-strip은 install로 바꿈.
    • ./configure --build=x86_64-w64-mingw32 --enable-threads=win32 --enable-relocatable
    • make
    • make install
       여기까지가 dll을 쓰는 shared library 설치. 
       이제 static 라이브러리 설치를 다음과 같이 하면 된다. 
       (그러나 실제 설치시에 너무 재 시도를 많이 하다보니 귀찮아서 이건 생략하고 바로 gettext 빌드로 넘어갔다.)
    • (make distclean) // 아무래도 이건 아닌 듯.  gettext 빌드 후 libiconv재빌드시에는 필요함.
    • ./configure --build=x86_64-w64-mingw32 --enable-threads=win32 --enable-relocatable --disable-shared
    • make
    • make install
       이렇게 static 라이브러리까지 설치했는데, 가이드에는 특이하게 libcharset.la와 libiconv.la를 다시 내려
       받도록 하고 있다.
       이건 좀 아닌 거 같아서 구글링 좀 했더니 단지 추측일 뿐이지만, 아마도 gettext와 연관된게 아닌가 싶다.
       그래서 가이드의 파일들을 내려받는 대신, 아래 GNU libiconv 페이지의 installation 항목에 설명된 대로 
       gettext를 설치 후, libiconv를 재설치해보기로 했다.

    2.1 gettext
        가이드에는 gettext에 대한 설치방법이 나와 있지 않아서 StackOverflow.com을 참조했다.
        • cd /usr/local
        • wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.3.2.tar.gz
        • tar xvzf gettext-0.18.3.2.tar.gz
        • cd gettext-0.18.3.2
        • ./configure --build=x86_64-w64-mingw32 --enable-threads=win32 --enable-relocatable
        • make
        • make install
        이어서 위의 libiconv 빌드를 반복하여 설치를 완료했다. 
        libiconv 재빌드할 때 우선 make distclean 명령으로 기존 libiconv 빌드 잔재를 clear한 후 재빌드하라고 gnu 사이트에 언급되어 있으나, 어찌된 일인지 make distclean을 하고 나면 ./configure 수행시 checking for msgmerge... 에서 꼼짝 않고 멈춰버린다.
        아마도 libiconv를 make distclean할 때 gettext가 생성한 msgmerge라는 파일이 삭제되는가 싶다.
        그래서 즉시 gettext를 ./configure는 다시 하지 않고 make, make install을 수행 후 libiconv를 재빌드할 수 있었다.
        순서를 정리하면, 위의 gettext 빌드에 이어서 다음과 같이 한다.
        • cd /usr/local/libiconv-1.13.1
        • make distclean
        • cd /usr/local/gettext-0.18.3.2
        • make
        • make install
        • cd /usr/local/libiconv-1.13.1
        • ./configure --build=x86_64-w64-mingw32 --enable-threads=win32 --enable-relocatable
        • make
        • make install

        3. jpeg
            libjpeg-turbo에 대해 이번에 알게 되었는데, 사용해도 될 거 같지만, NASM 설치에 ./configure 파일까지 수정하는 등, 향후 maintenance가 우려되어 그냥 IJG에서 배포하는 jpeg 8 버젼을 쓰기로 했다.  현재 최신버젼은 9인데, 이와 관련된 libjpeg-turbo 개발자의 입장을 읽고 나니 굳이 9버젼이 필요없겠다는 생각을 갖게 되었다.

            jpeg configure는 --enable-threads와 --enable-relocatable에 대해 unrecognized option warning을 주어서 이들은 생략하였고, --build=x86_64-w64-mingw32도 듣지 않는다.  또한 단순히 ./configure후 make를 해도 error가 난다.  

            이에 대한 해결책을 인터넷에서 찾다보니 jconfig.h에 #undef되어있는 HAVE_PROTOTYPE을 #define HAVE_PROTOTYPE으로 바꿔줘야 한다는 것을 발견했다. StackOverflow.com Q&A참조.

            이대로 하니 빌드는 되지만, 나중에 tiff 라이브러리 빌드시 또 다른 문제가 생긴다.  jpeg-8b 디렉토리에서 install.txt를 읽어보니 ckconfig.c파일을 가지고 configure를 잡는 방법이 있다.  이를 gcc로 컴파일하고 생성된 a.exe를 실행시키니 jconfig.h를 만들어주는데, 여기에는 HAVE_PROTOTYPE을 비롯하여 HAVE_UNSIGNED_CHAR, HAVE_UNSIGNED_SHORT, HAVE_STDDEF_H, HAVE_STDLIB_H가 #define된다.  하지만 이렇게 생성된 jconfig.h 파일에는 HAVE_BOOLEAN이 빠져 있다.

            이들은 모두 나중에 tiff 라이브러리 빌드시 에러로 보답한다. ㅠㅠ

            따라서 가장 나은 방법은 ./configure 수행후 jconfig.h 파일의 다음 항목들을 define하는 것이다.
            • #define HAVE_PROTOTYPE
            • #define HAVE_UNSIGNED_CHAR
            • #define HAVE_UNSIGNED_SHORT
            • #define HAVE_STDDEF_H
            • #define HAVE_STDLIB_H
            • #ifdef _WIN32 ==> #if defined(_WIN32) || defined(WIN32)
            이에 따라 빌드 명령을 다음과 같이 수정했다.
            • cd /usr/local
            • wget http://www.ijg.org/files/jpegsr8b.zip
            • unzip jpegsr8b.zip
            • cd jpeg-8b
            • ./configure
            • 잠깐! ===> 여기서 make 실행 전에 jconfig.h 위와 같이 수정
            • gcc ckconfig.c
            • a.exe  ===> jconfig.h를 생성해줌.
            • make
            • make install
            MinGW-w64 library들 설치하기-1에 이어서 계속 설치.

            핑백