블로그 이미지
lilla

Recent Comment

Recent Trackback

Archive

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
  • 267,847total
  • 0today
  • 12yesterday
2011.06.03 17:22 linux

저번에는 pkg-config 를 사용하여 compile 혹은 링킹에 필요한 정보를 얻어올 수 있다는 것을 알았습니다.

그러나 대부분의 개발은 corss compile 상황이기 때문에,
이번에는 corss compile 상에서의 pkg-config에 관하여 알아보겠습니다.

만약 server에 이미 X86용 glib이 설치되어 있는데, 개발용 타겟을 위해서 cross compiler용 glib을 설치한 경우에는 pkg-config를 어떻게 사용해야 할까요?

기본적으로(SUSE 11.1 기준) glib은 아래와 같이 위치 합니다.

# pkg-config --cflags --libs glib-2.0
  -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0
 

그러나 cross compile용으로 빌드한 glib을 예를들어 /cross 폴더에 install 하였다면 pkg-config의 결과가 달라져야 합니다.

위와 같은 상황을 해결하기위해서 pkg-config는 PKG_CONFIG_PATH라는 환경변수를 참조하게 됩니다.
PKG_CONFIG_PATH를 통하여 lib를 찾는 path를 임의로 변경할 수 있습니다.

man page에서 확인해보면 아래와 같이 설명되어 있습니다.

ENVIRONMENT VARIABLES
PKG_CONFIG_PATH
A colon-separated (on Windows, semicolon-separated) list of directories to search for .pc  files. The default directory will always be searched after searching the path; the default is  libdir/pkgconfig:datadir/pkgconfig where libdir is the libdir where pkg-config and datadir is the  datadir where pkg-con-fig was installed.

제 짧은 영어로 부연 설명을 하자면 여러 path를 ':' 으로 구분지어 설정할 수 있으며 .pc 파일을 찾는 directory를 설정하는 것입니다.

위와 같이 PKG_CONFIG_PATH를 변경함으로서 cross compile용으로 build 된 glib을 사용할 수 있게 됩니다.

# cd /cross/lib/pkgconfig
# export PKG_CONFIG_PATH=$PWD
# echo $PKG_CONFIG_PATH
  /cross/lib/pkgconfig
# pkg-config --cflags --libs glib-2.0
  -I/cross/include/glib-2.0 -I/cross/lib/glib-2.0/include -L/cross/lib -lglib-2.0
 

그러나 만약 이경우에 /cross 폴더에 없는 것을 (cross compile 하지 않은 다른 library) 검색할 경우에는 어떻게 될까요?

# pkg-config --cflags --libs libpng
  -I/usr/include/libpng12 -lpng12

분명히 /cross 폴더에는 없지만, server의 X86용 libpng가 나오는 군요.

이유는 PKG_CONFIG_PATH는 pkg-config 실행시 최 우선적으로 찾을 디렉토리를 설정하는 부분이기 때문에 PKG_CONFIG_PATH에서 찾지 못할 경우 default path를 검색하도록 되어있기 때문입니다.

별로 중요할거 같지 않지만, 사실 cross compile을 위한 여타 다른 library를 configure 할 경우에 문제가 발생할 소지가 있습니다.

configure 단계에서 설치된 library들을 pkg-config를 사용하여 검사하는데, cross compile 용으로 있지도 않은 library를 검색하여 물고들어간 후 (X86용 library를 설정하여) build 시에 오류가 나는 경우가 있기 때문입니다.

이 문제를 해결하기 위해서는 pkg-config의 default path를 변경하는 환경변수인 PKG_CONFIG_LIBDIR를 사용하면 됩니다.

# cd /cross/lib/pkgconfig
# export PKG_CONFIG_LIBDIR=$PWD
# pkg-config --cflags --libs libpng 
  Package libpng was not found in the pkg-config search path.
  Perhaps you should add the directory containing `libpng.pc'
  to the PKG_CONFIG_PATH environment variable
  No package 'libpng' found

/cross에는 libpng를 install 하지 않았기 때문에 정상적(?)으로 error를 내면서 libpng를 찾을 수 없다고 나옵니다.

위와 같은 방법으로 cross compile 상황에서도 유용하게 pkg-config를 사용하실 수 있으리라 생각됩니다.
많은 분들께서 유용하게 사용하셨으면 좋겠습니다. ^^;;

참고 : 
1. 실제 QT configure 파일을 살펴보면 아래와 같이 pkg-config를 사용하여 필요한 library들을 check하는 것을
   볼 수 있습니다. (pkg-config를 사용해서 glib, gthread의 cflags, libs를 찾습니다.)

  1.    ...  
  2.    # auto-detect Glib support  
  3.    if [ "$CFG_GLIB" != "no" ]; then  
  4.       if [ -n "$PKG_CONFIG" ]; then  
  5.          QT_CFLAGS_GLIB='$PKG_CONFIG --cflags glib-2.0 gthread-2.0 2>/dev/null'  
  6.          QT_LIBS_GLIB='$PKG_CONFIG --libs glib-2.0 gthread-2.0 2>/dev/null'  
  7.       fi  
  8.    ...  
2. pkg-config에는 위의 방법 말고도 여러 유용한 내용이 있습니다.
   man page를 살펴보세요. ^^;;
posted by linuxian lilla