QT/E 컴파일

Mokwon Univ 2008. 8. 16. 17:00
1. Embedded QT(이하 QT/E)를 컴파일 하기위한 소스를 Trolltech 홈페이지에서 받습니다.
2004년 10월 5일 현재 3.3.3 버전이 최신입니다.
다운로드 : ftp://ftp.trolltech.com/qt/source/
다른 버전으로 작업하길 원한다면, 트롤테크 홈페이지에서 쉽게 구할 수 있습니다.

2. 적당한곳에 압축을 풉니다.
  1. tar xvzf qt-embedded-free-3.3.3.tar.gz

3. QT/E를 컴파일 하기위해서 해당 타겟시스템에 맞는 크로스 컴파일러를 설정해 주어야 합니다.
mkspecs/qws 디렉토리를 보면 타겟시스템별 미리 설정된 크로스 컴파일러가 존재합니다.
arm 이나 mips등은 기본적인 설정 파일이 존재하며 만약 존재하지 않는다면
해당 cpu에 맞는 파일을 새로 생성하면 됩니다.
가령 ppc용 크로스 컴파일러를 설정하려면

  1. cp linux-x86-g++ linux-ppc-g++ -R
  2. cd linux-ppc-g++

linux-ppc-g++ 디렉토리에 보면 qmake.conf 파일과 qplatformdefs.h 파일이 존재합니다.

먼저 qmake.conf 파일을 열어서,
QMAKE_CC = gcc
부분을 해당 크로서 컴파일러의 gcc프로그램 이름으로 대치합니다. 위의 예는 ppc이므로
QMAKE_CC = linux-ppc-gcc
이런식으로 변경합니다.

당연한 이야기겠지만, linux-ppc-gcc 크로스 컴파일러를 미리 준비하셔야 합니다.
위와 마찬가지로 gcc 를 해당 크로스 컴파일러의 이름의 gcc로
g++역시 변경하면 됩니다.

이때 위와같이 linux-ppc-gcc로만 쓸경우에는 먼저 크로스 컴파일러에 대한 PATH를 설정하고
QT/E를 컴파일을 하시면 됩니다.
만약 PATH를 설정하지 않고 하신다면 linux-ppc-gcc가 위치한 전체 경로를 입력해 주시면 됩니다.
(이 부분에 대한 김용오님의 지적 감사합니다.)

qplatformdefs.h 파일은 기타 시스템에 관련된 특정 사항을 수정하는 내용인데
일반적인 시스템이라면 별다른 수정없이 그냥 두셔도 무방합니다.
만약 qplatformdef.h 파일에 정의된 함수명 이나 include path가 시스템에 따라
다르다면 수정하셔야 겠지만. 일반적인 임베디드 리눅스 환경에서는 거의 동일합니다.
(위 부분은 제가 겪은 환경을 위주로 작성된 내용이기 때문에 다소 틀릴 수도 있습니다.)
( 이 부분에 대한 김용오님의 지적 역시 감사합니다.)

4. QT/E 소스 최 상위로 돌아와서
소스 컴파일에 필요한 Makefile을 생성하기 위해 ./configure를 실행시킵니다.
./configure의 옵션은 여러가지가 있는데, 이 옵션에 따라서 QT/E 소스에서
특정 라이브러리를 빼내어 내거나, 설정사항을 변경할 수 있습니다.
./configure의 옵션값은 아래와 같습니다.

Usage:  configure [-prefix dir] [-buildkey key] [-docdir dir] [-headerdir dir]
        [-libdir dir] [-bindir dir] [-plugindir dir ] [-datadir dir]
        [-translationdir dir] [-sysconfdir dir] [-debug] [-release]
        [-no-gif] [-qt-gif] [-no-sm] [-sm] [-qt-zlib] [-system-zlib]
        [-qt-libjpeg] [-system-libjpeg] [-qt-libpng] [-system-libpng]
        [-qt-libmng] [-system-libmng] [-no-thread] [-thread] [-no-nis] [-nis]
        [-no-cups] [-cups] [-no-largefile] [-largefile] [-version-script]
        [-no-stl] [-stl] [-no-ipv6 ] [-ipv6] [-Istring] [-lstring]
        [-Lstring] [-Rstring] [-disable-<module>] [-with-<module setting>]
        [-without-<module setting>] [-fast] [-no-fast]
위 사항에서 해당 타겟에서 필요없는 부분을 제거합니다.
저의 경우에는

./configure -xplatform qws/linux-ppc-g++ -shared -release -depths 16 -thread -no-cups -no-ipv6 -no-nis

위와같이 설정하였습니다.
위의 내용을 보면
-xplatform qws/linux-ppc-g++ : 이 부분은 QT/E를 어떤 컴파일러로 컴파일 할지 결정하는 부분입니다. 위에서 이미 작성한 linux-ppc-g++ 파일의 설정대로 컴파일 하므로 이와같이 설정되었습니다.
-shared : shared ojbect 파일로 컴파일 합니다. QT/E로 작성된 프로그램 실행시 동적 Loading을 합니다. 만약 static으로 하고 싶다면 -static으로 설정해 주시면 됩니다.
-release : release 모드로 컴파일 합니다. 디버깅 정보를 담고있지 않으므로 라이브러리가 debug에 비해 작습니다. 만약 디버그로 컴파일 하고 싶다면 -debug로 설정하시면 됩니다.
-depths 16 : 이부분은 선택하지 않아도 ./configure 명령 실행후에 자연히 나타나지만 편의상 넣었습니다. 16이라는 것은 QT/E내에서 16bit color를 사용하겠다라는 의미입니다.
-thread : thread를 지원하는 QT/E 라이브러리를 생성합니다. 이부분이 비 활성화 되면 QT내에서 쓰레드를 사용할 수 없습니다.
-no-cpus : cpus 를 사용하지 않습니다.
-no-ipv6 : ipv6를 사용하지 않습니다.
-no-nis : nis를 사용하지 않습니다.

위와같이 타겟시스템의 목적에 맞게 적당히 설정한후에 $QTDIR 환경변수를
설정해서 현재 QT/E의 디렉토리를 설정합니다.

  1. export QTDIR=/home/korone/qte-ppc-3.3.3

이제 ./configure를 실행합니다.
실행후에 아래와 같은 메세지가 나옵니다.
GPL을 준수할 예정이므로 yes를 입력합니다.
no를 입력하면 compile이 중단됩니다. (^^)

This is the Qt/Embedded Free Edition.

You are licensed to use this software under the terms of
the GNU General Public License (GPL).

Type 'G' to view the GNU General Public License.
Type 'yes' to accept this license offer.
Type 'no' to decline this license offer.

Do you accept the terms of the license?

한참 makefile에 관련된 파일이 생성되고 나서 아래와 같은 메세지가 나타나면
./configure작업이 완료된것입니다.

Qt is now configured for building. Just run /usr/bin/gmake.
To reconfigure, run /usr/bin/gmake confclean and configure.

이제 make를 실행해서 QT/E를 컴파일 하면 완료됩니다.

5. QT/E를 성공적으로 컴파일 했다면
QT/E소스디렉토리중 lib 밑에 아래와 같은 파일이 생성됩니다.

libqte.so libqte.so.3 libqte.so.3.3 libqte.so.3.3.3
libqte-mt.so libqte-mt.so.3 libqte-mt.so.3.3 libqte-mt.so.3.3.3

위 파일중 -mt 가 붙은 파일은 multi thread용입니다. 만약 -thread를 안붙이고 ./configure했다면 -mt가 붙은 파일은 생성되지 않습니다.

이제 이 파일을 실제 타겟에 올립니다.
타겟의 적당한 디렉토리에 라이브러리를 카피합니다.
이때 libqte.so 부터 libqte.so3.3.3까지 모두 다 올릴 필요가 없습니다.
libqte.so.3 등 .so뒤에 숫자가 붙은것은 모두 libqte.so.3.3.3의 symbolic link이므로 용량큰 libqte.so.3.x.x 등을 카피할 필요가 없고, libqte.so.3.3.3 파일만 복사해 넣으면 됩니다.
저의 경우 아래와 같이 복사하였습니다.

  1. cp libqte-mt.so.3.3.3 /mnt/nfs/target/qt/lib
libqte-mt.so.3.3.3 파일을 target시스템의 /lib (root의 lib 폴더) 에 qt라는 디렉토리를 넣었습니다. (물론 타겟에 위 폴더가 존재하지 않는다면 먼저 만들어 넣어야 겠죠.)

그런다음 복사한 타겟폴더로 이동해서 symbolic 링크를 생성해 줍니다.
  1. cd /mnt/nfs/target/qt/lib
  2. ln -s libqte-mt.so.3.3.3 libqte-mt.so
  3. ln -s libqte-mt.so.3.3.3 libqte-mt.so.3
  4. ln -s libqte-mt.so.3.3.3 libqte-mt.so.3.3
  5. ln -s libqte-mt.so.3.3.3 libqte-mt.so.3.3.3
위와 같이 총 4개의 symbolic 링크를 생성했습니다.

이제 모든작업이 끝났습니다.
QT/E에 있는 적당한 예제를 타겟에 올려서 실행시키면 됩니다.
이때 예제를 실행시킬때 -qws옵션을 붙여야지 정상적으로 실행됩니다.
아래는 예제 입니다.

  1. ./hello -qws

6. 만약 타겟에 올려서 실행시켜볼 수 없는 상황이라면 host컴퓨터에서 바로
실행시켜볼 수가 있습니다.
이러한 역할을 하는것인 qvfb라는것인데, 이것은 x86용 qvfb가 필요합니다.
당연한 이야기겠지만 qvfb는 x86용 x window상에서 돌아가는 것이니까요.
x86용 qvfb는 QT/E소스 디렉토리의 tools/qvfb라는 폴더에 존재합니다.
tools 밑에 있는 qvfb라는 폴더는 x86용으로 컴파일 해야하면 단독적으로
컴파일 가능합니다.
이에대한 컴파일 수행후 실행시키면 x window상에서 표시가 되고.

x86으로 컴파일한 QT/E소스를 통해 작성한 예제코드를 아래와 같이 실행하면
qvfb에 표시되는것을 확인할 수 있습니다.

  1. ./hello -qws

감사합니다.
조병완

이 문서의 저작권은 http://www.korone.net 조병완에게 있습니다.
Posted by 용학도리
,