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 프로그램 오브젝트 파일과 그리고 폰트 파일이 필요하다.

  1. fontdir (/root/arm/qt-2.3.2/lib/fonts)
  2. hello (/root/tmake-1.8/example3)
  3. helvetica_100_50.qpf (/root/arm/qt-2.3.2/lib/fonts)
  4. helvetica_100_50_t10.qpf (/root/arm/qt-2.3.2/lib/fonts)
  5. 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윈도우와 서로 호환이 안되는 듯하다. 그래서 프로그램을 종료하려면 어쩔 수 없이, 요피를 리셋시켜주어야만 한다.

  • computer/embedded/qt_포팅하기.txt
  • Last modified: 3 years ago
  • by likewind