QT 로 만든 프로그램을 크로스 컴파일러를 이용해서 포팅하는 방법을 살펴본다. 여기서는 StrongArm 이 장착되어 있는 요피에 포팅해 볼 것이다. 포팅하기 전에 몇가지 준비물이 필요하다.
준비운동하기
크로스 컴파일러와 QT 임베디드 툴셋이 필요하다. 크로스 컴파일러의 경우, 기존의 요피용 컴파일러로는 QT 를 컴파일하는 과정에서 에러가 발생했다. 그래서 어쩔 수 없이, 서적인 '임베디드 리눅스 프로그래밍'에 첨부된 CD 안에 있는 컴파일러를 사용했다. QT 임베디드 툴셋은 아래의 주소에서 2.3.2 버전을 다운로드 받았다.
QT-Embedded | http://www.trolltech.com/download/qt/embedded.html |
Cross Complier | arm-linux-binutils-2.10-1.i386.rpm, arm-linux-gcc-2.95.2-2.i386.rpm, arm-linux-glibc-2.1.3-2.i386.rpm |
우선 컴파일러부터 설치하도록 한다. rpm 이므로 손쉽게 설치할 수 있다. 설치경로는 기본적으로 /usr/local/arm-linux 이다.
#export PATH=$PATH:/usr/local/arm-linux/bin
반드시 PATH 를 걸어주어야 한다.
이젠 QT 차례다. 이 과정은 QT 라이브러리를 ARM 용으로 컴파일하기 위함이다.
#mkdir ~/arm/ #cp qt-embedded-2.3.2.tar.gz ~/arm/ #tar xzvf qt-embedded-2.3.2.tar.gz #export QTDIR=~/arm/qt-2.3.2
QTDIR 아래의 Makefile 파일을 아래와 같이 수정한다.
# -*- makefile -*- # # Main Makefile for building the Qt library, examples and tutorial. # Read PORTING for instructions how to port Qt to a new platform. SHELL=/bin/sh init: FORCE @$(MAKE) QTDIR=`pwd` all all: symlinks src-moc src-mt sub-src sub-tools sub-tutorial sub-examples // tutorial, examples 삭제 @echo @echo "The Qt library is now built in ./lib" @echo "The Qt examples are built in the directories in ./examples" @echo "The Qt tutorials are built in the directories in ./tutorial" @echo @echo 'Note: be sure to set $$QTDIR to point to here or to wherever' @echo ' you move these directories.' @echo @echo "Enjoy! - the Trolltech team" @echo
굳이 위처럼 삭제를 해주지 않아도, 상관은 없지만 컴파일 시간을 줄이기 위한 목적이다.
이번에는 각 플랫폼 별로 설정을 해주어야 한다.
#cd $QTDIR/configs #ls
꽤 많은 파일들이 보일 것이다. 잘 살펴보면, 각 플랫폼 별로 각각 4개의 파일이 존재한다는 것을 알 수 있다.
여러가지 플랫폼 중에서 linux-arm -g++ 를 사용할 것이다. 이제 몇가지 수정을 해주는 일만 남았다.
우선 linux-arm-g++-shared 파일을 보자!!
# Compiling with support libraries SYSCONF_CXXFLAGS_X11 = SYSCONF_CXXFLAGS_QT = -I$(QTDIR)/include -I/usr/local/arm-linux/include // 경로 추가 SYSCONF_CXXFLAGS_OPENGL = -I/usr/X11R6/include ... ... .. SYSCONF_LINK_SHLIB = arm-linux-g++ SYSCONF_LINK_TARGET_SHARED = lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH) SYSCONF_LINK_LIB_SHARED = $(SYSCONF_LINK_SHLIB) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \ $(LFLAGS) -o $(SYSCONF_LINK_TARGET_SHARED) \ $(OBJECTS) $(OBJMOC) -L/usr/local/arm-linux/lib $(LIBS) && \ // 경로 추가 mv $(SYSCONF_LINK_TARGET_SHARED) $(DESTDIR); \ cd $(DESTDIR) && \ rm -f lib$(TARGET).so lib$(TARGET).so.$(VER_MAJ) lib$(TARGET).so.$(VER_MAJ).$(VER_MIN); \ ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so; \ ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so.$(VER_MAJ); \ ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so.$(VER_MAJ).$(VER_MIN)
위와 같이 수정했으면, 컴파일을 위한 Makefile 을 만들어보자!
#cd $QTDIR #./configure -xplatform linux-arm-g++ #make
도중에 몇가지 물음이 나오는 데, 차례대로 'yes → 4 → 16 → no' 하면 된다.
성공적으로 컴파일이 되었다면, lib 디렉토리 아래에 libqte.so.2.3.2 가 생성되었을 것이다.
#file libqte.so.2.3.2 #arm-linux-strip libqte.so.2.3.2
좀 더 확실하게 확인하기 위해서 file 명령을 실행한다. 용량을 줄이기 위해서 strip 명령을 사용했다.
이제 QT 라이브러리가 준비되었다. 이제는 실제 실행시켜볼 프로그램을 준비한다.
여기서는 가장 간단한 'hello world' 프로그램을 준비한다.
#export TMAKEPATH=~/tmake-1.8/lib/qws/linux-arm-g++ #cd /root/tmake-1.8/example3 <--- hello 예제 프로그램이 있는 곳 #tmake hello.pro -o Makefile #make #file hello #arm-linux-strip hello
마무리
앞 단계에서 생성한 QT 임베디드 라이브러리와 hello 프로그램 오브젝트 파일과 그리고 폰트 파일이 필요하다.
- fontdir (/root/arm/qt-2.3.2/lib/fonts)
- hello (/root/tmake-1.8/example3)
- helvetica_100_50.qpf (/root/arm/qt-2.3.2/lib/fonts)
- helvetica_100_50_t10.qpf (/root/arm/qt-2.3.2/lib/fonts)
- libqte.so.2.3.2 (/root/arm/qt-2.3.2/lib)
fontdir 파일의 경우, 약간의 수정이 필요하다
helvetica helvO10.bdf BDF y 50 100 u <---- 이 줄만 남기고 모두 지운다
.qpf 확장자가 폰트파일이다. 일단 저 두개의 파일 용도에 대해서 설명해야 겠다. 일반적으로 PDA 프로그램의 경우, 화면에 따라 프로그램을 돌릴 수 있어야 한다. 이 내용인 즉, 요피의 경우 LCD 가 320 X 480 이다. 필요에 따라 세로로 프로그램을 실행할 수도 있고, 가로로 돌릴 수도 있다. 이럴 때, 흔히 생각하기에 방향을 바꾸는 것은 폰트와 아무런 상관이 없을 것 같다고 생각할 수 있다. 나 또한 그랬으니…
하지만, 기본적으로(방향을 돌리지 않고) 실행할 때는 helvetica_100_50.qpf 만 있으면 된다. 하지만, 돌린다면,
helvetica_100_50_t10.qpf 이 필요하다. 만일 파일이 없다면, 폰트가 출력되지 않을 것이다.
위 파일들을 타겟보드(요피)에 올려야 한다. 나의 경우 FTP 를 이용했다.
#tar cvf yopy.tar yopy
위에서 yopy 라는 디렉토리에 위의 4개의 파일이 있다고 가정한다.
어렵사리, 컴파일한 프로그램을 실행하기 위해서는 요피에서도 몇가지 환경설정이 필요하다.
#mkdir /root/qt #mkdir /root/qt/lib #mkdir /root/qt/lib/fonts #cd /root/qt/lib
앞에서 만든 yopy.tar 을 /root/rec_data 아래에 올렸다고 가정한다. 일단 압축을 푼다.
이제 앞에서 만든 디렉토리에 복사를 해야 할 차례다.
#cd /root/rec_data/yopy #cp fontdir hello helvetica_100_50_t10.qpf /root/qt/lib/fonts #cp libqte.so.2.3.2 /root/qt/lib #cd /root/qt/lib #ln -s libqte.so.2.3.2 libqte.so #ln -s libqte.so.2.3.2 libqte.so.2 #ln -s libqte.so.2.3.2 libqte.so.2.3
마지막으로 환경 변수를 지정해준다.
#export QTDIR=/root/qt #export LD_LIBRARY_PATH=/root/qt/lib:$LD_LIBRARY_PATH
이제 직접 실행시켜보자!
#cd /root/qt/fonts #./hello -qws -display Transformed:Rot270:0
요피 LCD 를 보자! 어떤가? 어디서 많이 본 화면이 보이지 않는가!!
문제점
프로그램을 돌려보면 알겠지만, 터치스크린이 먹지 않는다. 또한 기존에 요피에서 사용하는 X윈도우와 서로 호환이 안되는 듯하다. 그래서 프로그램을 종료하려면 어쩔 수 없이, 요피를 리셋시켜주어야만 한다.