그래픽 & 멀티미디어
QT를 처음 학습할 때에는 QT/X11, QT/Embedded, QTopia 모두 설치해야 되는 줄 알았습니다. 그리고 반드시 QVFB를 준비해야되는 줄 알았습니다. 그러다 보니 설치 방법이 복잡하고 시간이 많이 걸렸죠. 거기다가 QT/X11, QT/Embedded, QTopia 세가지 프로그램에 대해 궁합이 맞는 버전으로 설치하려고 다시 설치하기를 여러 번했습니다.
더욱 한심한 것은 타겟 보드에 QT 프로그램을 실행하기 위해서는 QTopia를 설치했을 때 생성되는 이미지 파일이 반드시 있어야만 되는 줄 알았습니다. 즉, QTopia의 이미지 파일을 타겟 보드에 복사해 주어야 QT로 작성된 프로그램이 실행되는 줄 알았습니다. 웹에 의존하다 보니 귀동량을 완전히 엉뚱하게 했습니다.
그러나 실제 타켓 보드에는 QT/Embedded를 설치하면 생성되는 lib 디렉토리의 파일만 복사해 주면 되기 때문에 저 같은 경우 QTopia가 필요 없고, 대신에 PC에서 디버깅 하기 위한 QT/X11과 임베디드 용으로 컴파일하기 위한 QT/Embedded만 필요했습니다.
제가 사용하는 QT/X11은 QT 3.x.x 버전인데, 최근 리눅스를 설치하면 선택하여 바로 설치가 가능하기 때문에 별 다른 어려움이 없습니다. 그러므로 실제 설치하는 것은 QT/Embedded 3.3.8 뿐입니다. 즉, 가장 간단한 방법이 되겠습니다.
QT/X11이 없으시다면 리눅스의 패키지 관리자를 이용하시면 쉽게 설치하실 수 있습니다.
필요 파일 다운로드
ftp.trolltech.com - /qt/source/qt-embedded-free-3.3.8.tar.gz
E2fsprogs Ext2 Filesystem Utilities - e2fsprogs-1.40.2.tar.gz
ftp.scarlet.be - pub/freeware/SOURCES/jwpg-6b.tar.gz
압축 풀기
저는 QT를 /qt에 설치합니다. 즉, QT/Embedded를 타켓 보드에 맞추어 /qt 밑에 생성합니다. QT arm용을
]# cd / <- root 디렉토리로 이동 ]# mkdir qt <- /qt/ 디렉토리 생성
]# cd /qt <- /qt/ 디렉토리로 이동
]# zxvf /download/qt-embedded-free-3.3.8.tar.gz
]# mv qt-embedded-free-3.3.8/ qte-3.3.8-arm
]# tar zxvf /download/e2fsprogs-1.40.2.tar.gz
]# tar zxvf /download/jpeg-6b.tar.gz
uuid, jepg 라이브러리 설치
arm 용 uuid 라이브러리 설치 ]# cd /qt/e2fsprogs-1.40.2 ]# ./configure --prefix=/usr/arm-linux --host=i386 --target=arm --enable-elf-shlibs --with-cc=arm-linux-gcc ]# make ]# make install ]# make install-libs arm 용 jpeg 라이브러리 설치 ]# cd /qt/jpeg-6b ]# ./configure ]# vi Makefile 아래의 내용을 수정합니다. prefix = /usr -> prefix = /usr/arm-linux CC = cc -> CC= arm-linux-gcc AR = ar rc -> AR = arm-linux-ar rc AR2 = ranlib -> RANLIB = arm-linux-ranlib ]# make ]# make install-lib
환경 파일 생성
]# cd /qt ]# vi .qte #!/bin/bash export QTDIR=/qt/qte-3.3.8-arm export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
QT-Embedded 설치
]# source /qt/.qte ]# cd $QTDIR/bin ]# cp /usr/lib/qt-3.3/bin/uic . ]# cd .. ]# ./configure -embedded arm -system-jpeg -shared -thread -no-cups -no-ipv6 -qvfb -depths 16 라이센스에 yes Building on: linux-x86-g++-shared Building for: linux-arm-g++-shared Thread support..................... no Configuration...................... qconfig-qpe.h ]# make : Note: be sure to set $QTDIR to point to here or to wherever you move these directories. Enjoy! - the Trolltech team make[1]: Leaving directory `/qt/qte-arm' ]# cd lib ]# file libqte.so.2.3.10 libqte.so.2.3.10: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped -> 이렇게 ARM 용 파일이 만들어 졌다면 OK arm용 qpe에서도 jpeg 와 uuid 라이브러리를 사용할 수 있도록 라이브러리를 복사합니다. ]# cp /usr/arm-linux/lib/libuuid.* . ]# cp /usr/arm-linux/lib/libjpeg.* . ]# cp /usr/arm-linux/lib/libstdc++.so.5 .
arm 보드에서 QT 프로그램 실행
arm 보드에서 /app/qt/lib로 QT/Embedded lib를 복사한다고 가정하겠습니다.
QT/Embedded의 lib 디렉토리를 통째로 타켓 보드에 복사하면 되는데, cp 명령을 사용하면 링크파일까지 일반 파일로 복사되기 때문에
용량이 무척 커지게 됩니다. 그러므로 반드시 tar를 이용하여 압축한 후에 타겟 보드에서 풀기를 합니다. ]# tar zcvf /공유폴더/qt-arm-lib.tar.gz /qt/qte-3.3.8-arm/lib 이제 arm-board 를 부팅하고 Host PC와 nfs로 연결합니다. [이 부분부터는 arm-board에서의 작업 내용입니다.] ]$ mount -t nfs -o nolock 192.168.10.50:/공유폴더 /mnt/nfs ]$ mkdir /app/qt ]$ cd /app/qt ]$ tar zxvf /mnt/nfs/qt-arm-lib.tar.gz QT 프로그램을 위해 환경 설정을 합니다. 또는 파일을 만들어 놓습니다.
]$ export QTDIR=/app/qt
]$ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH Arm 보드에서 예제 프로그램 실행 보겠습니다. QT/Embedded가 설치된 디렉토리 안을 보시면 example/hello 디렉토리에 이미 hello 실행파일이 있습니다. 이 실행 파일을 공유 폴더에 복사한 후에 arm 보드에서 /mnt/nfs 디렉토리에서 직접 실행해 보십시오. ]$ /mnt/nfs/hello -qws
태그: *QT *그래픽
안녕하세요.. 위와 같이 한번 해보니 문제가 생겨서 글씁니다.
]#cd $QTDIR/lib
]# cp /usr/arm-linux/lib/libstdc++.so.5 . <-- 이부분에서 저는 libstdc++.so.5가 없는 대신 libstdc++.so.6.0.3이 있어서 이것을 복사했습니다. arm-linux-gcc 버전은 3.4.3, glibc-2.3.3입니다.
]#ln -s libstdc++.so.6.0.3 libstdc++.so.6
]#ln -s libstdc++.so.6 libstdc++.so
]#cp /usr/arm-linux/lib/libstdc++.la .
이렇게 링크도 걸어주고 관련파일도 복사해줘 봤습니다.
그런데..
]#qmake -project 를 하면
qmake: error while loading shared libraries: /qt/qte-3.3.8-arm/lib/libstdc++.so.6 : ELF file OS ABI invalid
라는 에러가 납니다.
그래서 저는 일단 이 libstdc++라이브러리를 제거하고 컴파일했습니다.
그런후 타겟에 간단히 작성한 윈도우프로그램도 띄어 보았고요.
제가 궁금한 건 이 libstdc++ 라이브러리가 필요한 것인지입니다.. 또 같은에러가 안나셧는지 하고요..
그럼 수고하세요...^^