노무현 대통령 배너


2006. 3. 22. 13:15

[본문스크랩] cross 컴파일시의 몇가지 테크닉


1. configure 의 arguments

# gpe ./configure --build=i686-pc-linux --host=arm-linux --prefix="/usr" --sysconfdir=/etc

위와 같이 --build 는 컴파일 하는 호스트의 종류, --host 는 실제 컴파일된 프로그램이 올라갈 타겟 머신의 종류를 나타냅니다. 기타 프로그램에 따라 다양한 argument를 설정할 수 있는데 이것은 ./configure --help로 확인해 봅니다. 위에서 gpe 라는 것은 cross compile을 위한 몇가지 환경변수를 정의한 것으로 각자 편한대로 만들어 사용합니다.

# cat /usr/bin/gpe
export CROSS=/opt/q+esto/cdt
export PATH=$CROSS/arm-linux/bin:$PATH
export CC=arm-linux-gcc
export HOSTCC=gcc
export CXX=arm-linux-g++
export LD=arm-linux-ld
export STRIP=arm-linux-strip
export PKG_CONFIG_PATH=$CROSS/arm-linux/lib/pkgconfig
$*


2. libtool 고치기
일반적으로 configure를 돌리면 libtool 파일을 생성하게 되는데 libtool에 다음과 같은 내용이 있는경우

sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"

링크할때 toolchain의 library와 링크하는 것이 아니라 호스트에 설치되어 있는 library와 링크하는 경우가 있습니다. 따라서 이것은 다음과 같이 null로 바꾸어 주십시오

sys_lib_search_path_spec=""

3. libxxx.la 파일
/opt/q+esto/cdt/arm-linux/lib/libpango-1.0.la 와 같은 확장자가 .la 인 파일들은 libtool이 읽는 파일로서 xxx 라는 라이브러리가 어디에 설치되어 있는지 의존성이 있는 라이브러리들은 어떤 것이 있는지에 대한 정보를 가지고 있습니다.

예를들어 pango의 경우에서 보면 pango가 필요로하는 라이브러리들에 대한 정보를 가지고 있음을 알 수 있는데 만일 이것이 /usr/lib 등으로 잘못 되어 있는 겨우 libtool이 link할 때 잘못된 정보를 가지고 링크를 하게 됩니다.

# cat /opt/q+esto/cdt/arm-linux/lib/libpango-1.0.la
# Libraries that this one depends upon.
dependency_libs=' -L/opt/q+esto/cdt/arm-linux/lib /opt/q+esto/cdt/arm-linux/lib/libgobject-2.0.la /opt/q+esto/cdt/arm-linux/lib/libgmodule-2.0.la -ldl /opt/q+esto/cdt/arm-linux/lib/libglib-2.0.la -lm'

# Directory that this library needs to be installed in:
libdir='/opt/q+esto/cdt/arm-linux//lib'

4. xxx.pc 파일
/opt/q+esto/cdt/arm-linux/lib/pkgconfig/pango.pc 와 같이 확장자가 .pc인 파일들은 pkg-config 이라는 프로그램이 읽어들이는 파일입니다. 다음과 같이 컴파일 및 링킹에 필요한 정보를 가지고 있습니다.

# cat /opt/q+esto/cdt/arm-linux/lib/pkgconfig/pango.pc
prefix=/opt/q+esto/cdt/arm-linux/
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

pango_module_version=1.2.0

Name: Pango
Description: Internationalized text handling
Version: 1.2.5
Requires: glib-2.0,gobject-2.0,gmodule-2.0
Libs: -L${libdir} -lpango-1.0
Cflags: -I${includedir}/pango-1.0

pkgconfig 프로그램은 다음과 같은 형태로 makefile 등에서 호출되어 컴파일 시 이용됩니다.

# export PKG_CONFIG_PATH=/opt/q+esto/cdt/arm-linux/lib/pkgconfig
# pkg-config --cflags --libs pango
-I/opt/q+esto/cdt/arm-linux//include/pango-1.0 -I/opt/q+esto/cdt/arm-linux//include/glib-2.0 -I/opt/q+esto/cdt/arm-linux//lib/glib-2.0/include -Wl,--export-dynamic -L/opt/q+esto/cdt/arm-linux//lib -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 -lm

.pc 파일에서 prefix가 /usr 나 /usr/local 등으로 잘못 지정되어 있을 경우 pkg-config을 이용하는 Makefile은 호스트의 라이브러리를 찾게 됩니다. PKG_CONFIG_PATH 환경변수는 pkg-config 프로그램이 어디에서 .pc 파일들을 찾을지를 지정하는 변수입니다.