iPhone 용 GLib 라이브러리 빌드하기

GLib 라이브러리는 크로스컴파일이 가능하도록 구성된 라이브러리 입니다. iPhone 프로그램을 개발시 GObject 기반의 어플리케이션을 만들거나 이미 GLib 라이브러리를 이용하도록 되어 있는 경우, 새로 프로그램을 작성하는 것보다 GLib 라이브러리를 iPhone 프로그램에서 동작하도록 하는 것이 더 편할 수 있습니다.
이 문서는 GLib 라이브러리를 iPhone 에서 이용하기 위해 apple arm 컴파일러를 이용하여 크로스 컴파일하는 과정을 기록합니다.
단 현재 GLib 라이브러리를 이용하는 프로젝트에서 GIO 모듈을 이용하지 않기 때문에 실제 빌드시 제거하도록 합니다.
이문서에서 사용하는 디렉토리 구조는 아래와 같습니다.

glib-2.22.2/
gettext-tools/
libiconv/
lib/

lib 디렉토리는 빌드환경에 존재하지 않지만 빌드에 필요한 파일들을 유지하는 디렉토리입니다. lib 디렉토리 안에는 다음 파일들을 유지합니다.

libintl.a
libintl.h
libiconv.a
crt_externs.h
iphone.cache

GLib 소스 구하기
이 문서에는 GLib 2.22.2 버전의 소스를 이용합니다 . 이 소스를 다운로드 받아 먼저 GIO 모듈을 빌드하지 않도록 아래의 3개의 파일에서 GIO 관련 의존성을 제거합니다.

  • Makefile.in
  • configure
  • docs/reference/Makefile.in

첨부된 패치파일을 이용하여 의존성을 제거합니다.

$ tar jxvf glib-2.22.2.tar.bz2
$ patch -d glib-2.22.2 -p1 < apple-darwin.patch

빌드환경 구성하기
GLib 라이브러리를 빌드하기 위해서는 3개의 Mac용 라이브러리가 필요합니다.

  • libtool
  • pkgconfig
  • glib2-devel

Macport 가 설치되어 있지 않은 경우, 다음 사이트에서 Macport 패키지를 다운로드 받아 설치해 주어야 한다.

다음 아래의 명령으로 빌드에 필요한 패키지를 설치합니다.

$ sudo macport install libtool pkgconfig glib2-devel

또한 libintl 라이브러리가 필요합니다. 하지만 IPhone SDK  에는 이 라이브러리가 존재하지 않기 때문에 이 라이브러리를 먼저 빌드해 주어야 합니다(gettext-0.17 버전을 이용하도록 한다).

아래 설정으로 라이브러리를 생성하고 libintl.a 파일과 libintl.h 파일을 IPhone SDK 에 복사해 주거나 별도의 위치에 유지하여 -I,-L 옵션으로 연결해 주어야 합니다.

$ CFLAGS="-I//Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/lib" \ 
./configure --prefix=./gettext-tools \
              CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-gcc-4.2.1 \
	      CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-g++-4.2.1 \
	      AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar \
              LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld \
              CFLAGS="--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk -march=armv6 -mcpu=cortex-a8" \
	      CPPFLAGS="--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk -march=armv6 -mcpu=cortex-a8" \
	      --build=i686-apple-darwin \
              --host=arm-apple-darwin \
              --enable-static=yes \
              --disable-shared

Makefile 이 생성되면 라이브러리를 생성합니다.

$ make
$ cp libintl/.libs/libintl.a ../lib

또 하나의 라이브러리를 생성합니다. libiconv 라이브러리는 IPhone SDK 에 dylib 형태로 존재하지만, static 라이브러리로 생성해 놓습니다. 소스는 1.13.1 버전소스을 이용합니다.
이 라이브러리는 실제 어플리케이션과 GLib 라이브러리 연결시 함께 링크해 줍니다. 옵션은 위와 동일합니다.

cp .libs/libiconv.a ../lib

빌드작업 수행하기
빌드환경까지 작업이 마무리되면 실제 Makefile 생성과 라이브러리를 생성합니다. 먼저 GLib 크로스컴파일 문서를 참고로 cache 파일을 생성합니다. 해당 프로젝트에서는 아래의 옵션을 이용합니다

glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_va_val_copy=no
glib_cv_rtldglobal_broken=no
glib_cv_uscore=no
ac_cv_func_posix_getpwuid_r=no
ac_cv_func_posix_getgrgid_r=no

이후 아래의 옵션으로 configure 를 수행합니다.

 $ IPHONE_LIB=../lib
CFLAGS="-I$IPHONE_LIB -I//Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/Developer/SDKs/iPhoneOS3.1.sdk/usr/include"  LDFLAGS="-L$IPHONE_LIB -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/lib" \ 
./configure CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-gcc-4.2.1 \ 
               CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-g++-4.2.1 \
               AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar \
               LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld \
               AS=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as \
               CFLAGS="--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk -march=armv6 -I$IPHONE_LIB" \
               CPPFLAGS="--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk -march=armv6" \
               --cache-file=../lib/iphone.cache \
               --build=i686-apple-darwin \
               --host=arm-apple-darwin \
               --without-pic \
               --enable-static=yes \
               --disable-shared

Makefile 이 생성되고 이 Makefile 을 이용하여 컴파일 작업을 수행합니다.

$ make

이때 두가지 에러가 발생합니다. 처음 발생하는 에러는 iPhone SDK 에 존재하는 libiconv.dylib 라이브러리를 검사시 gnu 방식으로 연결되지 않고 native 방식으로 연결이 되어 실제 빌드시 glib/gconvert.c 파일에서 발생합니다.

#if !defined(USE_LIBICONV_GNU) && defined (_LIBICONV_H)
#error GNU libiconv not in use but included iconv,h is from libiconv
#endif

소스에서 이 부분을 제거해 줍니다. 실제 라이브러리 링크시 이전에 생성한 libiconv.a 파일과 링크를 시도하기 때문에 실제동작에서는 문제없이 동작합니다.

두번째 발생하는 에러는 _NSGetEnviron 심볼을 찾지 못하는 문제입니다. 이경우 /usr/include 헤더 안의 crt_externs.h 파일을 iPhone SDK 에 복사하거나 -I 옵션을 연결하여 줍니다.
이 두 부분을 적용하고 빌드시 libglib.a 라이브러리가 생성됩니다.
libglib.a 라이브러리를 링크시 이전에 생성해 놓은 libintl.a 라이브러리와 libiconv.a 라이브러리를 GLib 라이브러리와 함께 링크시 GLib 라이브러리를 이용할 수 있습니다.

Creative Commons License
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 2.0 Korea License.
This entry was posted in Development. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">