Sunday, September 5, 2010

Debugging with gdb

Hi all,
i need to setup a remote debug session of a QT application.
Since i have some problems i started with a local debugging using gdb ./app + run. This was ok.
Then i used two shells in which i launched gdbserver in the first one and gdb in the second one.

gdbserver:

Qt Code:
Switch view 1.[root@centos-sd seashell]# gdbserver :2345 ./seadragonshellapp2.Process ./seadragonshellapp created; pid = 70633.Listening on port 23454.Remote debugging from host 127.0.0.1[root@centos-sd seashell]# gdbserver :2345 ./seadragonshellapp
Process ./seadragonshellapp created; pid = 7063
Listening on port 2345
Remote debugging from host 127.0.0.1To copy to clipboard, switch view to plain text mode

gdb:

Qt Code:
Switch view 1.(gdb) target remote :23452.Remote debugging using :23453.0x0097f7c0 in ?? ()4.(gdb) list5.No symbol table is loaded. Use the "file" command.6.(gdb) run7.The program being debugged has been started already.8.Start it from the beginning? (y or n) n9.Program not restarted.10.(gdb) start11.No symbol table loaded. Use the "file" command.12.(gdb)(gdb) target remote :2345
Remote debugging using :2345
0x0097f7c0 in ?? ()
(gdb) list
No symbol table is loaded. Use the "file" command.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) n
Program not restarted.
(gdb) start
No symbol table loaded. Use the "file" command.
(gdb)To copy to clipboard, switch view to plain text mode

I don't understand why since the project is the same
Any known problem on gdbserver?

Thanks


...................................................................
Try:
gdb ./seadragonshellapp
(gdb) target remote :2345
(gdb) cont

GDB를 이용한 디버깅 설명 사이트 주소

http://korea.gnu.org/manual/release/gdb/gdb.html

How to use gdb server

디버깅 방식은 원격 디버깅방법을 사용할려고 합니다.

그래서 관련 자료를 찾아보니 다음과 같이 하더군요

호스트 PC <-----------------------> 타겟보드
gdb <-----------------------> gdbserver

GDB-5.3을 사용했습니다.

먼저 호스트PC에는 다음과 같이 설정 및 컴파일 했습니다.

./configure --host=i686-pc-linux-gnu --prefix=/usr/local/gdb-5.3-x86 --norecursion

이렇게 하니 호스트PC의 /usr/local/gdb-5.3-x86 디렉토리에 설치가 되더군요..

그래서 테스트삼아 hello 프로그램을 작성하여 gdb 를 실행하니 잘 됩니다.


이제는 타겟보드에 사용될 GDB는 다음과 같이 설정 및 컴파일했습니다.

./configure --target=arm-linux --host=arm-linux --build=i686-pc-linux-gnu --prefix=/usr/local/gdb-5.3-x86 --norecursion

호스트PC의 /usr/local/gdb-5.3-arm 디렉토리에 설치되더군요...

file 명령어를 사용하여 /usr/local/gdb-5.3-arm/bin 디렉토리에 있는 실행파일들을 살펴보니 ARM 버전으로 잘 나왔습니다.

그래서 타겟보드상의 /usr/local 디렉토리에 nfs 를 이용하여 복사를 했습니다.

즉 호스트 PC의 ARM용 GDB를 타겟보드에 탑재하였습니다.

타겟보드의 /usr/local/gdb-5.3-arm/bin 디렉토리에는 gdb, gdbserver 실행파일이 있습니다.

그래서 먼저 타겟보드에서 다음과 같이 실행했습니다.

(1) # gdbserver 203.253.176.177:8080 hello

Process hello created; pid = 73

그리고 호스트PC에서 다음과 같이 실행했습니다.

(2) # gdb
GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".

(3) (gdb) target remote 203.253.176.177:8080 hello
Remote debugging using 203.253.176.177 hello
0x00000000 in ?? ()

출력이 어째 좀 이상합니다. (3)을 호스트PC에서 실행시켰을때 타겟보드에서는 다음과 같이 출력됩니다.

(4) Remote debugging from host 203.253.176.177


그래서 호스트PC에서 gdb의 명령어를 실행하면 다음과 같이 출력됩니다.

(gdb) b hello.c:7
No symbol table is loaded. Use the "file" command.
(gdb) n
Cannot find bounds of current function
(gdb) list
No symbol table is loaded. Use the "file" command.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program:
No executable file specified.
Use the "file" or "exec-file" command.


그리고 타겟보드에서는 다음과 같이 출력되고 끝나버립니다.

Killing inferior

뭐가 잘못된 건지요...

제가 잘못 설정하고 컴파일했나요?

도움부탁드립니다.

How to Qt Embeded debugging?

1. qt 에서 디버깅 해보려면 qDebug 나 printf문으로
중간 중간 심어 놓고 재대로 값이 나오나 확인해보면서 작업하는데요..

2. 그리고 Makefile 보니까 플래그 중에 -DQT_NO_DEBUG 로 설정 돼있는데..

디버깅 정보를 빼는 옵션 같은데요 이걸 -DQT_DEBUG로 고쳐서 컴파일하면..
디버깅 정보가 생길텐데.. 그럼 뭘로 디버깅 추적이 가능한지요?

//////////////////////////////////////////////////////////////////
타켓으로 내리면
gdbserver이나,( 가능 사용해봤습니다.)
gdb에서 remote 검색해보니까( 시리얼통신으로
gdb에서도 가능한거 같네요.. 타켓으로 내리면

Wednesday, August 11, 2010

폰트 작은거 나의 성공사례

./launcher -qws -display :LinuxFb:/dev/fb2:mmWidth106:mmHeight62:0 &

Qt : 타겟에서 실행시 이미지와 폰트가 작게 나올경우

[QT/Embedded] QT4.4.3 을 보드에 포팅하였는데 기본폰트 크기가 너무 작습니다

답변이 없어서 자답을 하게 되네요...
후에 이와 관련된 문제가 있을시에 도움을 주고자 자답을 합니다.

QT4로 오면서 QWS_DISPLAY를 자신의 하드웨어와 매칭시켜주어야 하는것 같더군요.

그래서 저는 embedded설정하는 곳에서
export QWS_DISPLAY="LinuxFb:mmWidth=400:mmHeight=240"
으로 설정하였습니다.

제 보드의 화면 크기는 800*480인데 이를 반으로 줄여주었습니다.

이렇게 하여 화면에 디스플레이하는것을 조정하였습니다.

다음분들도 이런방법으로 해결하시길 빕니다. 답변이 없어서 자답을 하게 되네요...
후에 이와 관련된 문제가 있을시에 도움을 주고자 자답을 합니다.

QT4로 오면서 QWS_DISPLAY를 자신의 하드웨어와 매칭시켜주어야 하는것 같더군요.

그래서 저는 embedded설정하는 곳에서
export QWS_DISPLAY="LinuxFb:mmWidth=400:mmHeight=240"
으로 설정하였습니다.

제 보드의 화면 크기는 800*480인데 이를 반으로 줄여주었습니다.

이렇게 하여 화면에 디스플레이하는것을 조정하였습니다.

다음분들도 이런방법으로 해결하시길 빕니다.

QT의 크기를 줄이자

QT의 크기를 줄이자장길석http://forum.falinux.com/zbxe/?document_srl=4519472008.06.05 10:15:49 (*.105.125.81) 5110이번 글은 강좌나 개발 팁이 아니라 다른 분의 도움을 구하기 위해 올리는 글입니다. 글의 주제는 QT 라이브러리의 크기입니다. 더욱이 저는 QT4를 사용하고 있어서 라이브러리 크기가 부담 스럽습니다.

]# du -h lib/
32K lib/pkgconfig
15M lib/fonts
31M lib/
]#QT lib 크기가 자그만치 31M입니다. 그나마 다행(?)인 점은 폰트만 15M를 차지한다는 점입니다. 그럼 라이브러리의 크기를 줄이려면 어떻게 할까요?

strip으로 파일 크기 줄이기

라이브러리 파일에는 컴파일 시에 링크를 위한 참조 정보인 심볼이 있습니다. 이 심볼은 실행할 때는 필요 없기 때문에 삭제하여 크기를 줄일 수 있습니다. 이렇게 압축이 아닌 필요없는 정보를 삭제하는 것이라 기대만큼 파일 크기가 줄어 들지는 않더군요.

gcc 로 컴파일하셨다면 strip로, arm-linux-gcc 로 컴파일하셨다면 arm-linux-strip를 이용하시면 됩니다. 물론 arm-mipsel-gcc라면 arm-mipsel-strip가 되겠지요. 그럼 파일별로 크기를 보겠습니다.

[root@jwLinux lib]# ls -al -h
++계 17M
drwxr-xr-x 4 root root 4.0K 5+?21 01:06 .
drwxrwxrwt 18 root root 4.0K 5+?25 21:08 ..
drwxr-xr-x 2 root root 4.0K 5+?21 01:06 fonts
-rw-r--r-- 1 root root 707 5+?21 01:06 libQtCore.la
-rw-r--r-- 1 root root 637 5+?21 01:06 libQtCore.prl
lrwxrwxrwx 1 root root 18 5+?25 11:13 libQtCore.so -> libQtCore.so.4.3.4
lrwxrwxrwx 1 root root 18 5+?25 11:13 libQtCore.so.4 -> libQtCore.so.4.3.4
lrwxrwxrwx 1 root root 18 5+?25 11:13 libQtCore.so.4.3 -> libQtCore.so.4.3.4
-rwxr-xr-x 1 root root 2.6M 5+?21 01:06 libQtCore.so.4.3.4
-rw-r--r-- 1 root root 755 5+?21 01:06 libQtGui.la
-rw-r--r-- 1 root root 692 5+?21 01:06 libQtGui.prl
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtGui.so -> libQtGui.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtGui.so.4 -> libQtGui.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtGui.so.4.3 -> libQtGui.so.4.3.4
-rwxr-xr-x 1 root root 11M 5+?21 01:06 libQtGui.so.4.3.4
-rw-r--r-- 1 root root 778 5+?21 01:06 libQtNetwork.la
-rw-r--r-- 1 root root 690 5+?21 01:06 libQtNetwork.prl
lrwxrwxrwx 1 root root 21 5+?25 11:13 libQtNetwork.so -> libQtNetwork.so.4.3.4
lrwxrwxrwx 1 root root 21 5+?25 11:13 libQtNetwork.so.4 -> libQtNetwork.so.4.3.4
lrwxrwxrwx 1 root root 21 5+?25 11:13 libQtNetwork.so.4.3 -> libQtNetwork.so.4.3.4
-rwxr-xr-x 1 root root 589K 5+?21 01:06 libQtNetwork.so.4.3.4
-rw-r--r-- 1 root root 771 5+?21 01:06 libQtScript.la
-rw-r--r-- 1 root root 687 5+?21 01:06 libQtScript.prl
lrwxrwxrwx 1 root root 20 5+?25 11:13 libQtScript.so -> libQtScript.so.4.3.4
lrwxrwxrwx 1 root root 20 5+?25 11:13 libQtScript.so.4 -> libQtScript.so.4.3.4
lrwxrwxrwx 1 root root 20 5+?25 11:13 libQtScript.so.4.3 -> libQtScript.so.4.3.4
-rwxr-xr-x 1 root root 1.4M 5+?21 01:06 libQtScript.so.4.3.4
-rw-r--r-- 1 root root 750 5+?21 01:06 libQtSql.la
-rw-r--r-- 1 root root 678 5+?21 01:06 libQtSql.prl
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSql.so -> libQtSql.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSql.so.4 -> libQtSql.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSql.so.4.3 -> libQtSql.so.4.3.4
-rwxr-xr-x 1 root root 297K 5+?21 01:06 libQtSql.so.4.3.4
-rw-r--r-- 1 root root 771 5+?21 01:06 libQtSvg.la
-rw-r--r-- 1 root root 699 5+?21 01:06 libQtSvg.prl
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSvg.so -> libQtSvg.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSvg.so.4 -> libQtSvg.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtSvg.so.4.3 -> libQtSvg.so.4.3.4
-rwxr-xr-x 1 root root 462K 5+?21 01:06 libQtSvg.so.4.3.4
-rw-r--r-- 1 root root 750 5+?21 01:06 libQtXml.la
-rw-r--r-- 1 root root 678 5+?21 01:06 libQtXml.prl
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtXml.so -> libQtXml.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtXml.so.4 -> libQtXml.so.4.3.4
lrwxrwxrwx 1 root root 17 5+?25 11:13 libQtXml.so.4.3 -> libQtXml.so.4.3.4
-rwxr-xr-x 1 root root 563K 5+?21 01:06 libQtXml.so.4.3.4
drwxr-xr-x 2 root root 4.0K 5+?21 01:06 pkgconfig
[root@jwLinux lib]# 11Mbyte나 되는 libQtGui.so.4.3.4의 크기를 줄여 보겠습니다. strip를 사용하기 전에 파일 정보를 알아 보겠습니다.

]# file libQtGui.so.4.3.4
libQtGui.so.4.3.4: ELF 32-bit LSB shared object, MIPS, version 1 (SYSV), not stripped
]#mipsel-linux-strip으로 파일 크기를 줄이고 파일 정보를 확인해 보겠습니다.

]# mipsel-linux-strip libQtGui.so.4.3.4
]# file libQtGui.so.4.3.4
libQtGui.so.4.3.4: ELF 32-bit LSB shared object, MIPS, version 1 (SYSV), stripped
]# ls -al -h libQtGui.so.4.3.4
-rwxr-xr-x 1 root root 9.4M 5+?25 21:28 libQtGui.so.4.3.4
]# 파일 크기가 11M 에서 9.4M으로 줄기는 줄었습니다만 기대만큼은 아니죠. 압축이 아니라 파일 내용 중에 실행에 필요없는 정보를 삭제하는 것이라 많이 줄지는 않더군요. 나머지를 모두 줄여 보았습니다.

]# ls -al -h
++계 15M
-rwxr-xr-x 1 root root 2.4M 5+?25 21:31 libQtCore.so.4.3.4
-rwxr-xr-x 1 root root 9.4M 5+?25 21:31 libQtGui.so.4.3.4
-rwxr-xr-x 1 root root 506K 5+?25 21:31 libQtNetwork.so.4.3.4
-rwxr-xr-x 1 root root 1.3M 5+?25 21:31 libQtScript.so.4.3.4
-rwxr-xr-x 1 root root 250K 5+?25 21:31 libQtSql.so.4.3.4
-rwxr-xr-x 1 root root 389K 5+?25 21:31 libQtSvg.so.4.3.4
-rwxr-xr-x 1 root root 488K 5+?25 21:31 libQtXml.so.4.3.4
]# du -h
15M ./fonts
32K ./pkgconfig
30M .
]#
줄기는 줄었지만 역시 기대만큼은 아니죠. 그래도 1개의 바이트 공간도 아쉬운 임베디드 환경에서 큰 차이는 아니더라도 이용하는 것이 좋겠습니다.

사용하지 않는 폰트 삭제

그다음에 눈에 띄는 것이 역시 폰트입니다.

lib]# cd fonts/
fonts]# ls -al
++계 14728
drwxr-xr-x 2 root root 4096 5+?21 01:06 .
drwxr-xr-x 4 root root 4096 5+?25 21:31 ..
-rw-r--r-- 1 root root 466696 5+?21 01:06 DejaVuSans-Bold.ttf
-rw-r--r-- 1 root root 441736 5+?21 01:06 DejaVuSans-BoldOblique.ttf
-rw-r--r-- 1 root root 434576 5+?21 01:06 DejaVuSans-Oblique.ttf
-rw-r--r-- 1 root root 493564 5+?21 01:06 DejaVuSans.ttf

...중략...

-rw-r--r-- 1 root root 1602 5+?21 01:06 micro_40_50.qpf
-rw-r--r-- 1 root root 1215089 5+?21 01:06 unifont_160_50.qpf
-rw-r--r-- 1 root root 672139 5+?21 01:06 wenquanyi_120_50.qpf
-rw-r--r-- 1 root root 672139 5+?21 01:06 wenquanyi_120_75.qpf
-rw-r--r-- 1 root root 715342 5+?21 01:06 wenquanyi_130_50.qpf
-rw-r--r-- 1 root root 715342 5+?21 01:06 wenquanyi_130_75.qpf
-rw-r--r-- 1 root root 804903 5+?21 01:06 wenquanyi_150_50.qpf
-rw-r--r-- 1 root root 804903 5+?21 01:06 wenquanyi_150_75.qpf
-rw-r--r-- 1 root root 1276472 5+?21 01:06 wenquanyi_160_50.qpf
-rw-r--r-- 1 root root 1276236 5+?21 01:06 wenquanyi_160_75.qpf
fonts]# wenquanyi 폰트만 6.6M나 됩니다. 이 외에 필요없는 포트를 함께 삭제해서 사용하고 있습니다.

Qt/E에서 사용 가능한 폰트 변환

Qt/E에서 사용 가능한 폰트 변환 오픈소스 by 버들피리 2006/01/01 19:45 beodeulpiri.egloos.com/9799950 덧글수 : 0
Qt/E font

Qt/E에서 사용 가능한 폰트
■ TrueType (TTF)
■ Postscript Type1 (PFA/PFB)
■ Bitmap Distribution Format fonts (BDF)
1. 각 크기마다 각각의 폰트를 가짐
2. Embedded system의 특성상 너무 느린 폰트 로딩 속도와 많은 디스크 공간을 차지하여 잘 사용되지 않음
■ Qt Prerendered Font (QPF)
1. BDF font와 같이 크기를 조정할 수 없음
2. Qt에서 제공하는 font format
3. BDF font에 비해 매우 작은 크기로 로딩 속도와 디스크 공간을 절약할 수 있음
4. Qt가 BDF, TTF font를 load해서 rendering이라는 절차를 거치는 과정에서 만들어내는 font

폰트 변환
■ QPF font는 TTF, BDF 등으로부터 생성할 수 있음
1. Tools 이용
2. -savefonts option 이용
3. $QTDIR/lib/font/fontdir 수정 후 이용
■ Tool 이용
1. makeqpf ($QTDIR/tools/makeqpf directory)
2. ./makeqpf를 실행하여 list item을 클릭하면 font가 생성됨
■ 실행 시 option 이용
1. -savefonts
2. ./application –qws –savefonts
3. application에서 사용한 font가 application 최초 실행 시 생성됨

윈도우 타이틀바 제거하기

setWindowFlags(Qt::FramelessWindowHint);

Tuesday, August 10, 2010

How can I change Qt font directory?

# QFontDatabase: Cannot find for directory /usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib/fonts - is Qt installed correctly?

directory path of message above are my host's directory.
How can I set directory for embedded target?

Qt supported font types

embedded Qt 한글 출력 (qte 3.0.4버젼)

1. qt는 PFA/FPB BDF,TTF,qtf 폰트등을 지원합니다.

2. qpf 폰트는 qt가 이들 bdf, ttf 폰트를 로드해서 rendering 이라는 절차를 거치는 과정에서 qpf라는 폰트를 나름대로 만들어서 사용을 하는 폰트입니다. qt쪽에서 보다 더 빠르게 만들어 놓은 format입니다.

3. qpf font를 만들기 위해선 x86용 embedded qt가 있어야 합니다. X86용 일반 qt는 안됩니다.


4. 프로그램 실행 옵션 중에 -savefonts 가 있습니다. 이 옵션을 주게 되면 내부적으로 사용하는 qpf를 디스크에 save를 해줍니다.

4. fontdir 파일의 사용방법
우선 $QTDIR/src/kernel/qfontmanager_qws.cpp 파일을 보면 자세히 나와있습니다.
(version마다 이 부분의 순서와 옵션이 다르며, 저 파일이 아닌 다른파일내에 존재할수있습니다. 반드시 저 부분을 확인후에 fontdir 설정을 하시던가 아니면 qt내의 fontdir내의 다른 폰트 설정을 참고하셔야합니다)



name - 프로그램에서 사용하는 setFont() 함수의 첫번째 인자에 해당합니다.
file - file이름
renderer - BDF or TTF
italic - 이텔릭체를 표현하겠냐? y or n
weight - 글씨의 굵기
size - 글씨의 크기
flags - 3가지 값을 가질 수 있습니다.
s - smooth anti-alias를 지원하는 폰트에 해당
u - font 체계가 unicode형식을 지원할 때
a - ascii 코드


주의할 것은 flags 중 u, a 값은 -savefonts 를 할 때 중요한 영향을 끼칩니다. 즉 사용하는 폰트가 unicode 형식을 지원한다고 해도 fontdir 에 u flag 를 써주지 않으면 savefonts 할 때 기본적으로 ascii 영역의 코드 밖에 저장되지 않습니다.

반 s 옵션의 font는 4-8kbyte 정도이나 u나 au 옵션일 경우 1-2Mbyte정도 나옵니다. 파일 크기만 비교해봐도 Unicode font인지 아닌지 추측 할수있습니다.

5. ttf의 한글폰트를 qpf로 바꾸는 방법

5.1 사용자가 임의로 추가한 폰트가 userfont.ttf 라고 할 때, 이 파일을 $QTDIR/lib/fonts 디렉토리에 넣습니다. 이때 QT는 x86용 embedded QT입니다.
( version에 따라 $QTDIRlib/fonts가 없을경우 $QTDIR/etc/fonts 일수 있습니다.)

5.2 fontdir 파일을 수정합니다. 다음 줄을 추가합니다.
….
userfont userfont.ttf FT y 50(bold일경우 75) 0 u(또는 au)

5.3 $QTDIR/examples/hello 프로젝트에서 main.cpp를 내에서 setFont를 해주는 부분에서 userfont 를 사용할 수 있게 수정을 합니다. 필요한 fontsize 와 bold형태에 따라 모두 추가합니다. 몇 개라도 상관없습니다. 다넣어도 됩니다.

setFont("userfont",14,50)
QFont qf;
qf = QFont("userfont ",10,50);  
h.setFont(qf);
qf = QFont("userfont ",10,75);  
h.setFont(qf);
qf = QFont("userfont ",12,50);  
h.setFont(qf);
qf = QFont("userfont ",12,75);  
h.setFont(qf);
….


5.4 hello 프로젝트를 컴파일 합니다.
5.5 ./hello –qws –savefonts 라고 실행합니다. 이때 정상적을 폰트가 생성되면 창이 뜨는데 시간이 걸립니다. 만약 바로 실행되었을경우에는 font가 생성되지 않은겁니다.
( tip : fonts 내에 전에 만들어둔 qpf 파일이 있을경우 u, au 옵션을 바꾼다고 해서 새로 생성되지 않습니다. 반드시 새로 만들경우 기존의 폰트를 지우시기 바랍니다)

5.6 그럼 $QTDIR/lib/fonts 에 userfont_100_50.qpf 등이 폰트들이 생깁니다.

6. qtf 폰트를 사용하기

6.1 어떤 문서에는 fontdir내에 qpf 폰트를 등록하라고 되어있지만, qt3.x 부터는 qpf 폰트는 등록이 필요없이 자동으로 fonts를 검색하여 로드하게 됩니다.

6.2 qpf 폰트명이 qt 폰트 사용명이 됩니다.
userfont_100_50.qpf
QFont qf = QFont(“userfont”, 10, 50)

userfont_120_50.qpf
QFont qf = QFont(“userfont”, 12, 50)

userfont_100_75.qpf
QFont qf = QFont(“userfont”, 10, 75)

6.3 target에는 저 qpf 폰트들을 $QTDIR/lib/fonts내에 copy만 해주면 사용이 가능합니다.

7. TTF 폰트도 각 폰트 문자셋을 unicode base로 만들었는지 KSC5601 base로 만들었는지에 따라서 출력이 안될 수도 있습니다.

8. linux내에 등록되어 있는 batang.ttf gulim.ttf 는 unicode base로 만들어져 있습니다.
예를 들면, 한글 '가'는 unicode 일 경우 0xac00, KSC5601일 경우는 0xb0a1 입니다.

분명 응용프로그램을 작성할 때 vi를 이용했을 것입니다. 만약 이렇게 vi에서 한글은 KSC5601입니다. 따라서 이를 unicode 값으로 바꿔줘야 합니다. 이때 이용하는 것은 codec이 있습니다.

#include
QEucKrCodec* codec = new QEucKrCodec();
char* string="한글입니다";
QString hangul = codec->toUnicode(string, strlen(string));

이렇게 유니코드로 바꿔줍니다. hangul을 리스트 박스에 넣어보면 한글이 보일 것입니다

폰트에 관해 보다 자세한 사항은 아래 사이트를 참조하십시요
http://doc.trolltech.com/3.0/fonts-qws.html 사실 저도 아직 큐티에서 폰트를 만들어 보지를 않아서 딱히뭐라
말씀드리기 힘들어서 여기 저기 알아보니 아래와 같은 글들을 찾았습니다. 도움이 되시길 바라며, 저도 한번 해보도록 하겠습니다.^^;

http://www.korone.net/bbs/board.php?bo_table=qt_lecture&wr_id=89&page=7

http://achiven.tistory.com/1175582971
======================================================
embedded Qt 한글 출력 (qte 3.0.4버젼)

1. qt는 PFA/FPB BDF,TTF,qtf 폰트등을 지원합니다.

2. qpf 폰트는 qt가 이들 bdf, ttf 폰트를 로드해서 rendering 이라는 절차를 거치는 과정에서 qpf라는 폰트를 나름대로 만들어서 사용을 하는 폰트입니다. qt쪽에서 보다 더 빠르게 만들어 놓은 format입니다.

3. qpf font를 만들기 위해선 x86용 embedded qt가 있어야 합니다. X86용 일반 qt는 안됩니다.


4. 프로그램 실행 옵션 중에 -savefonts 가 있습니다. 이 옵션을 주게 되면 내부적으로 사용하는 qpf를 디스크에 save를 해줍니다.

4. fontdir 파일의 사용방법
우선 $QTDIR/src/kernel/qfontmanager_qws.cpp 파일을 보면 자세히 나와있습니다.
(version마다 이 부분의 순서와 옵션이 다르며, 저 파일이 아닌 다른파일내에 존재할수있습니다. 반드시 저 부분을 확인후에 fontdir 설정을 하시던가 아니면 qt내의 fontdir내의 다른 폰트 설정을 참고하셔야합니다)



name - 프로그램에서 사용하는 setFont() 함수의 첫번째 인자에 해당합니다.
file - file이름
renderer - BDF or TTF
italic - 이텔릭체를 표현하겠냐? y or n
weight - 글씨의 굵기
size - 글씨의 크기
flags - 3가지 값을 가질 수 있습니다.
s - smooth anti-alias를 지원하는 폰트에 해당
u - font 체계가 unicode형식을 지원할 때
a - ascii 코드


주의할 것은 flags 중 u, a 값은 -savefonts 를 할 때 중요한 영향을 끼칩니다. 즉 사용하는 폰트가 unicode 형식을 지원한다고 해도 fontdir 에 u flag 를 써주지 않으면 savefonts 할 때 기본적으로 ascii 영역의 코드 밖에 저장되지 않습니다.

반 s 옵션의 font는 4-8kbyte 정도이나 u나 au 옵션일 경우 1-2Mbyte정도 나옵니다. 파일 크기만 비교해봐도 Unicode font인지 아닌지 추측 할수있습니다.

5. ttf의 한글폰트를 qpf로 바꾸는 방법

5.1 사용자가 임의로 추가한 폰트가 userfont.ttf 라고 할 때, 이 파일을 $QTDIR/lib/fonts 디렉토리에 넣습니다. 이때 QT는 x86용 embedded QT입니다.
( version에 따라 $QTDIRlib/fonts가 없을경우 $QTDIR/etc/fonts 일수 있습니다.)

5.2 fontdir 파일을 수정합니다. 다음 줄을 추가합니다.
….
userfont userfont.ttf FT y 50(bold일경우 75) 0 u(또는 au)

5.3 $QTDIR/examples/hello 프로젝트에서 main.cpp를 내에서 setFont를 해주는 부분에서 userfont 를 사용할 수 있게 수정을 합니다. 필요한 fontsize 와 bold형태에 따라 모두 추가합니다. 몇 개라도 상관없습니다. 다넣어도 됩니다.

setFont("userfont",14,50)
QFont qf;
qf = QFont("userfont ",10,50);  
h.setFont(qf);
qf = QFont("userfont ",10,75);  
h.setFont(qf);
qf = QFont("userfont ",12,50);  
h.setFont(qf);
qf = QFont("userfont ",12,75);  
h.setFont(qf);
….


5.4 hello 프로젝트를 컴파일 합니다.
5.5 ./hello –qws –savefonts 라고 실행합니다. 이때 정상적을 폰트가 생성되면 창이 뜨는데 시간이 걸립니다. 만약 바로 실행되었을경우에는 font가 생성되지 않은겁니다.
( tip : fonts 내에 전에 만들어둔 qpf 파일이 있을경우 u, au 옵션을 바꾼다고 해서 새로 생성되지 않습니다. 반드시 새로 만들경우 기존의 폰트를 지우시기 바랍니다)

5.6 그럼 $QTDIR/lib/fonts 에 userfont_100_50.qpf 등이 폰트들이 생깁니다.

6. qtf 폰트를 사용하기

6.1 어떤 문서에는 fontdir내에 qpf 폰트를 등록하라고 되어있지만, qt3.x 부터는 qpf 폰트는 등록이 필요없이 자동으로 fonts를 검색하여 로드하게 됩니다.

6.2 qpf 폰트명이 qt 폰트 사용명이 됩니다.
userfont_100_50.qpf
QFont qf = QFont(“userfont”, 10, 50)

userfont_120_50.qpf
QFont qf = QFont(“userfont”, 12, 50)

userfont_100_75.qpf
QFont qf = QFont(“userfont”, 10, 75)

6.3 target에는 저 qpf 폰트들을 $QTDIR/lib/fonts내에 copy만 해주면 사용이 가능합니다.

7. TTF 폰트도 각 폰트 문자셋을 unicode base로 만들었는지 KSC5601 base로 만들었는지에 따라서 출력이 안될 수도 있습니다.

8. linux내에 등록되어 있는 batang.ttf gulim.ttf 는 unicode base로 만들어져 있습니다.
예를 들면, 한글 '가'는 unicode 일 경우 0xac00, KSC5601일 경우는 0xb0a1 입니다.

분명 응용프로그램을 작성할 때 vi를 이용했을 것입니다. 만약 이렇게 vi에서 한글은 KSC5601입니다. 따라서 이를 unicode 값으로 바꿔줘야 합니다. 이때 이용하는 것은 codec이 있습니다.

#include
QEucKrCodec* codec = new QEucKrCodec();
char* string="한글입니다";
QString hangul = codec->toUnicode(string, strlen(string));

이렇게 유니코드로 바꿔줍니다. hangul을 리스트 박스에 넣어보면 한글이 보일 것입니다

폰트에 관해 보다 자세한 사항은 아래 사이트를 참조하십시요
http://doc.trolltech.com/3.0/fonts-qws.html

Monday, August 9, 2010

QT/Embedded] 실행시 에러는 없는데 화면에 아무것도 안 뜹니다

내가 겪은 똑같은 상황을 질문한 내용 ----


타겟보드는 ARM 계열 CPU를 사용합니다.
qt-everywhere-opensource-src-4.6.1 를 다운받아서
크로스 컴파일은 성공적으로 했습니다.
컴파일 된 데모중 간단한것(examples/dialogs/findfiles)을 타겟보드에 올려서 실행하니
무슨 라이브러리들이 없다고 하길래 일일이 실행시켜보면서 필요한 라이브러리들을
다 복사했습니다.
그런 다음 또 실행하니 폰트 디렉토리가 설정이 안 되어 있다고 해서
폰트파일 다 다운로드 한 다음 심볼릭 링크로 경로 설정해두었습니다.
그런 다음 실행하니

QWSSocket::connectToLocalFile could not connect:: Connection refused
QWSSocket::connectToLocalFile could not connect:: Connection refused
QWSSocket::connectToLocalFile could not connect:: Connection refused
QWSSocket::connectToLocalFile could not connect:: Connection refused
QWSSocket::connectToLocalFile could not connect:: Connection refused
QWSSocket::connectToLocalFile could not connect:: Connection refused
No Qt for Embedded Linux server appears to be running.
If you want to run this program as a server,
add the "-qws" command-line option.

라느 메시지가 떠서 "-qws"옵션을 주고 실행했더니 에러는 안 나는데 화면에 아무것도 안 뜨더군요.
그래서 다른 이유 때문일거라고 추측하고 정말로 간단한 예제인
아래의 "hello"예제를 컴파일해서 타겟보드에 올린다음 실행했습니다.

#include
#include

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();

return app.exec();
}

그런데도 실행시 에러는 없지만 화면에 아무것도 안 뜹니다.
(더 정확히 상황을 묘사하자면 부팅 로고 이미지가 계속 떠있습니다.)
혹시 프레임버퍼 관련해서 뭔가 해줘야 하는 것이 있는지요.

참고로 Microwindow는 그냥 컴파일해서 실행시키면 제대로 나왔습니다.
nano-X를 실행시키면 부팅로고 이미지가 사라지면서 검은 배경색으로 채워졌고
이 상태에서 Microwindow 프로그램을 띄우면 제대로 나왔습니다.

답변 부탁드립니다 (__)

Friday, August 6, 2010

How to use directfb plug in Qt 4.6Suppose your application name is qt-apps.How you are running it? ./qt-apps -qws is nt it? Just like it you can run i

Suppose your application name is qt-apps.How you
are running it? ./qt-apps -qws is nt it? Just like it you can run it for
directfb as ./qt-apps -qws -display directfb . If it says that no directfb
plugins ...check your installation path of plugins .if libdirectfbscreen.so
present ther in your install directory in
plugins/gfxdriver/libdirectfbscreen.so ,It will invoke directfb .If it is
not there You should compile it in src/plugins/gfxdriver/directfb and
compile it and make install.
You can export it in your shell enviroment also.
Just go through this link
http://doc.trolltech.com/4.6/qt-embedded-running.html

just use -display directfb in command line to invoke directfb plugin driver
> and source code for this is
> qt-everywhere-opensource-src-4.6.0/src/plugins/gfxdrivers/directfb
>
> On Tue, May 4, 2010 at 1:04 AM, Krishnaveni Sistu (c)
> wrote:
>
> I have tried the following configuration option to build Qt4.6
>
> ../qt-$Qt_Ver/qt/configure -verbose -xplatform qws/linux-armv6wrs-g++
> -plugin-gfx-directfb
>
> -qt-kbd-brcm1107 -embedded arm -little-endian -no-largefile -no-phonon
> -no-phonon-backend
>
> -no-cups -no-mitshm -no-fontconfig -no-qvfb
>
>
>
> I have compiled moveblocks.c from the examples folder. When I executed it
> seems to be loading libqdirectfbscreen.so but not really using it. I have
> print statements in DirectFBScreenDriverPlugin. The prints from the
> constructor and the keys routine are getting printed but the print
> statements in create function are never getting printed. Looks like the
> create is not getting called at all.


This e-mail and any files transmitted with it are ShoreTel property, are
> confidential, and are intended solely for the use of the individual or
> entity to whom this e-mail is addressed. If you are not one of the named
> recipient(s) or otherwise have reason to believe that you have received this
> message in error, please notify the sender and delete this message
> immediately from your computer. Any other use, retention, dissemination,
> forwarding, printing, or copying of this e-mail is strictly prohibited
>

How to use ram disk?

Thursday, August 5, 2010

How to build BSP for TCC8900?

Linux Kernel Build
# patch -p0 < patch_linux_2.6.28-xxxxxx-Rxxxxxx
# cd linux-2.6.28-tcc
# make tcc89000_defconfig
# make menuconfig (set settings and save and quit)
# make; chmod +x tcc_mkrd.sh; ./tcc_mkrd.sh


Bootloader Build
# make distclean
# make
- some information displayed
# make 'information displayed above'

Ramdisk Build
# tcc_mk_rootfs.sh

How to increase ramdisk on TCC8900

change value of RAMDISK in tcc-mkrd.sh which is in bsp kernel source folder

How can I get ramdisk size?

# dmesg | grep RAMDISK

Sunday, August 1, 2010

우분투에 10.04 LTS에 QT4.6.2 phonon 포함 설치

사용자 계정 로그아웃 후 root로 로그인

8. [시스템] - [관리] - [시냅틱 패키지 관리자]에서
gst dev,
dbus dev,
get base,
gst base,
openssl dev,
sqlite dev,
alsa dev,
libqt4,
qt4,
phonon,
codec
로 검색하여 속한 모든 프로그램 및 패키지를 설치

9. QT 실행

.................

우분투에 10.04 LTS 에서 gstreamer 에 관한 개발을 할 때 필요한 패키지를 설치하는 명령어는 다음과 같습니다.

sudo apt-get -y install gstreamer-tools gstreamer0.10-alsa gstreamer0.10-doc gstreamer0.10-esd gstreamer0.10-ffmpeg gstreamer0.10-gnonlin gstreamer0.10-nice gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-tools gstreamer0.10-x libgnome-media0 libgstreamer-plugins-base0.10-0 libgstreamer-plugins-base0.10-dev libgstreamer0.10-0 libgstreamer0.10-dev

우분투에 10.04 LTS 에서 qt4의 개발환경을 설치하는 명령은 다음과 같습니다.

sudo apt-get -y install libqt4-assistant libqt4-dbg libqt4-dbus libqt4-designer libqt4-dev libqt4-gui libqt4-help libqt4-multimedia libqt4-network libqt4-opengl libqt4-opengl-dev libqt4-phonon-dev libqt4-qt3support libqt4-script libqt4-scripttools libqt4-sql libqt4-sql-mysql libqt4-sql-odbc libqt4-sql-psql libqt4-sql-sqlite libqt4-sql-sqlite2 libqt4-svg libqt4-test libqt4-webkit libqt4-webkit-dbg libqt4-xml libqt4-xmlpatterns libqt4-xmlpatterns-dbg libqwt5-doc libqwt5-qt4 libqwt5-qt4-dev qt4-demos qt4-designer qt4-dev-tools qt4-doc qt4-qmake qtcreator qtcreator-doc

sudo apt-get install build-essential bin86 kernel-package libstdc++6 g++ gcc libc6-dev gcc-3.4 libncurses5-dev python-dev python patch m4 make ccache perl diffstat bitbake wget curl ftp cvs git subversion git tar bzip2 gzip unzip jade docbook docbook-utils texinfo texi2html sec bison bc libsdl1.2-dev mktemp help2man gawk qemu nfs-kernel-server tftpd tftp xinetd ssh vim libx11-dev

우분투의 경우 기본적으로 개발패키지가 빠져있습니다. 기본적인 개발환경을 설치해주는 명령을 올립니다. 해당 명령은 우분투 9.04에서 확인 하였습니다.

sudo apt-get install build-essential 하면 왠만한거 다 설치됩니다.
물론 svn, git이런거는 그때그때 설치해 주셔야 하긴 하지만요.

Friday, July 30, 2010

How to build Qt Embedded source for ARM?

1. ARM compiler installed in /opt/armv6
2. Add to path /opt/armv6/bin to PATH environment
2.1. export LD_LIBRARY_PATH=/opt/armv6/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.3.2/:$LD_LIBRARY_PATH
3. modify mkspecs/qws/linux-arm-g++/qmake.conf file to match your cross-compiler name
4. run configure
./configure -embedded arm -xplatform qws/linux-armv6-g++ -prefix /usr/local/Trolltech/Qt-4.6.3-arm
5. make
- you could get the error
- http://www.qtforum.org/article/31460/qt-everywhere-make-for-arm-fails-tslib-0-0-so-0-not-found.html
6. make install


other samples
1. ./configure -embedded arm -no-armfpa -little-endian -qt-gfx-transformed -qt-gfx-linuxfb -nomake demos -nomake examples -no-svg -no-phonon -no-qt3support -no-feature-CURSOR -qt-mouse-tslib -L/usr/local/lib -I/usr/local/include
2. make
3. make install

../qt-everywhere-opensource-src-4.6.1/configure -opensource -confirm-license -embedded arm -platform linux-g++-32 -xplatform qws/linux-arm-eabi-crunch-g++ -no-qvfb -depths all -prefix /net/home/maurik/cross-compile/arm-linux-gnueabi/usr/local/Qt4.6 -no-webkit -no-script -no-javascript-jit -no-scripttools -qt-mouse-tslib -no-neon -no-rpath

Cross-Compiling Qt for Embedded Linux Applications

Home · All Classes · All Functions · Overviews

Cross-Compiling Qt for Embedded Linux Applications

Cross-compiling is the process of compiling an application on one machine, producing executable code for a different machine or device. To cross-compile a Qt for Embedded Linux application, use the following approach:

Step 1: Set the Cross-Compiler's Path
Step 2: Create a Target Specific qmake Specification
Step 3: Provide Architecture Specific Files
Step 4: Provide Hardware Drivers
Step 5: Build the Target Specific Executable
Note: The cross-compiling procedure has the configuration process in common with the installation procedure; i.e., you might not necessarily have to perform all the mentioned actions depending on your current configuration.

Step 1: Set the Cross-Compiler's Path
Specify which cross-compiler to use by setting the PATH environment variable. For example, if the current shell is bash, ksh, zsh or sh:

export PATH=path/to/cross/compiler:$PATHStep 2: Create a Target Specific qmake Specification
The qmake tool requires a platform and compiler specific qmake.conf file describing the various default values, to generate the appropriate Makefiles. The standard Qt for Embedded Linux distribution provides such files for several combinations of platforms and compilers. These files are located in the distribution's mkspecs/qws subdirectory.

Each platform has a default specification. Qt for Embedded Linux will use the default specification for the current platform unless told otherwise. To override this behavior, you can use the configure script's -platform option to change the specification for the host platform (where compilation will take place).

The configure script's -xplatform option is used to provide a specification for the target architecture (where the library will be deployed).

For example, to cross-compile an application to run on a device with an ARM architecture, using the GCC toolchain, run the configure script at the command line in the following way:

./configure -embedded arm -xplatform qws/linux-arm-g++ If neither of the provided specifications fits your target device, you can create your own. To create a custom qmake.conf file, just copy and customize an already existing file. For example:

cp path/to/QtEmbedded/mkspecs/qws/linux-mips-g++/...
path/to/QtEmbedded/mkspecs/qws/linux-myarchitecture-g++/...Note: When defining a mkspec for a Linux target, the directory must be prefixed with "linux-". We recommend that you copy the entire directory.

Note also that when providing you own qmake specifcation, you must use the configure script's -xplatform option to make Qt for Embedded Linux aware of the custom qmake.conf file.

Step 3: Provide Architecture Specific Files
Starting with Qt 4, all of Qt's implicitly shared classes can safely be copied across threads like any other value classes, i.e., they are fully reentrant. This is accomplished by implementing reference counting operations using atomic hardware instructions on all the different platforms supported by Qt.

To support a new architecture, it is important to ensure that these platform-specific atomic operations are implemented in a corresponding header file (qatomic_ARCH.h), and that this file is located in Qt's src/corelib/arch directory. For example, the Intel 80386 implementation is located in src/corelib/arch/qatomic_i386.h.

See the Implementing Atomic Operations documentation for details.

Step 4: Provide Hardware Drivers
Without the proper mouse and keyboard drivers, you will not be able to give any input to your application when it is installed on the target device. You must also ensure that the appropriate screen driver is present to make the server process able to put the application's widgets on screen.

Qt for Embedded Linux provides several ready-made mouse, keyboard and screen drivers, see the pointer handling, character input and display management documentation for details.

In addition, custom drivers can be added by deriving from the QWSMouseHandler, QWSKeyboardHandler and QScreen classes respectively, and by creating corresponding plugins to make use of Qt's plugin mechanism (dynamically loading the drivers into the server application at runtime). Note that the plugins must be located in a location where Qt will look for plugins, e.g., the standard plugin directory.

See the How to Create Qt Plugins documentation and the Plug & Paint example for details.

Step 5: Build the Target Specific Executable
Before building the executable, you must specify the target architecture as well as the target specific hardware drivers by running the configure script:

cd path/to/QtEmbedded
./configure -embedded -qt-kbd-
-qt-mouse- -qt-gfx-It is also important to make sure that all the third party libraries that the application and the Qt libraries require, are present in the tool chain. In particular, if the zlib and jpeg libraries are not available, they must be included by running the configure script with the -L and -I options. For example:

cd path/to/QtEmbedded
./configure
-L /path/to/libjpeg/libraries -I /path/to/libjpeg/headersThe JPEG source can be downloaded from http://www.ijg.org/. The Qt for Embedded Linux distribution includes a version of the zlib source that can be compiled into the Qt for Embedded Linux library. If integrators wish to use a later version of the zlib library, it can be downloaded from the http://www.gzip.org/zlib/ website.

Then build the executable:

cd path/to/myApplication
qmake -project
qmake
makeThat's all. Your target specific executable is ready for deployment.

See also:
Qt for Embedded Linux Architecture and Deploying Qt for Embedded Linux Applications.





--------------------------------------------------------------------------------

Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies) Trademarks Qt 4.6.3

Sunday, July 25, 2010

Qt/E 개발환경

Embedded C++ GUI Programming with Qt - Qt의 기능 및 활용전략

2. Qt의 기능 및 활용전략
Qt의 설계자체가 Platform Independent한 설계를 위해 작성된 라이브러리여서 GUI 뿐만 아니라 GUI외적인 요소들을 포함하여 플랫폼 독립적으로 동작 가능하도록 설계되어 있습니다. 이러한 설계자체가 Embedded Linux특화된 제품에 있어서 그다지 큰 메리트는 아니지만, X11/Mac/Windows용 프로그램을 작성할 때 큰 이점이 될 수 있습니다.
Embedded Linux측면에서 본다면 개략적인 초안을 Windows나 X11환경에서 작업해놓고 포팅을 할 수 있다는 의미와 같습니다.
Qt가 단순 GUI를 표현하는 것 외에 추가 기능을 가지고 있다면 프로그램 개발에 있어서 사용하지 않을 이유는 없을 것 입니다. 하지만 경우에 따라서 Embedded 기기에서 실행시키기에는 너무나 부하가 많이 걸리는 부분이나 필요없다고 판단하는 부분은 잘 선별해서 검토를 해야합니다.
가령 Ethernet이 없는 기기에서 동작되는 프로그램을 개발하거나 DB가 필요치 않는 프로그램을 개발하는데 Qt가 가지는 Network, DB 관련 클래스는 필요없이 존재하고 있는 부하가 될 소지가 있습니다. Embedded 기기자체가 작은양의 NOR/NAND의 저장장치, 메모리를 사용하고있는 상황에서 개발비 상승을 가지고 올 수 있는 부분을 제거 하는 것이 올바른 선택이라고 생각합니다.
Qt는 필자 제 나름대로 크게 두 가지로 나누어 보고 각각의 항목에 대해서 추가적으로 나누어 보았습니다. 앞서 언급한대로 GUI와 GUI외적인 요소인데 그 내용은 아래와 같습니다. 아래에서는 간략히 큰 흐름과 간략한 설명을 하고 추후에 다시 이에 대한 자세한 내용을 살펴보도록 하겠습니다.
2.1 GUI
Qt의 GUI시스템은 Core System과 Widget set을 갖습니다. Core System은 QApplication객체로서 main()함수를 통해 프로그램을 처음 시작할 때 QApplication객체를 생성하고 이 생성된 객체의 exec()함수를 호출해서 message dispatch 루틴을 호출합니다.
Message dispatch는 계속 반복적으로 loop을 수행하며 사용자의 입력(마우스(터치패드),키보드, 기타)장치로부터 받은 것을 처리하거나, GUI 동작에 필요한 각종 제어들이 수행됩니다.
QApplication 위에는 실제 화면에 보여주기 위한 Widget들이 화면에 표시되는데 이러한 Dialog, Tab, Button, Label, List등등의 일반적으로 볼 수 있는 Widget들이 갖추어져 있습니다.
만약 PDA, Windows 운영체제와 유사한 기기를 개발한다면 이를 그대로 사용해도 무리가 없겠지만 만약 TV나 PDA, Windows운영체가 아닌 가전의 느낌을 가지도록 해야한다면 새롭게 작성되어야 합니다.
새롭게 작성된다는 의미가 처음부터 새로 개발하는 것이 아나라 이미 잘 갖추어진 Qt의 Widget들을 재 상속받아서 필요한 부분만 재정의해서 구현한다면 큰 힘을 들이지 않고 이용을 할 수 있습니다.
Qt가 내세우고 있는 signal/slot이라는 개념은 Win32 API등에서 볼 수 있었던 무수한 switch case의 노동(?)에서 자유로울 수 있습니다. Signal/slot이라는 간결하고도 쉬운구조로 인해서 GUI 프로그래밍에서 메시지처리의 지저분한 디자인을 한층더 간결하게 만들어 줍니다.

2.2 Non GUI
GUI외적인 요소들은 크게 다음과 같이 정리할 수 있습니다.
2.2.1 Thread
만약 Multi Thread로 작성되는 프로그램을 개발해야 한다면 GUI가 수행중에 다른 Thread를 생성해서 이를 처리해야 할 것 입니다. 이때 QThread라는 pthread wrapper class는 design측면에서 또한 GUI요소들과 병행해서 처리해야 할 때 동기화 문제 및 thread safe문제들을 쉽고 명확하게 해결해 줄 수 있습니다.
pthread로 처리해야할 때 난무하는 각종 처리부분들이 하나의 thread class로 구분되어 작성된다면 디버깅이 난해한 thread처리에 있어서 많은 이점을 가져다 줄 수 있습니다.

2.2.2 Network
최근 Ethernet이 기본장착된 제품이 많은 상황에서 요구되는 TCP/UDP 프로토콜 기반처리를 쉽게 처리할 수 있는 기반을 제공합니다. 동기/비동기 처리에 있어서 굳이 Multi thread환경으로 작성하지 않아도 될 정도로 깔끔하게 잘 정돈되어 있습니다.

2.2.3 DB
DB를 처리해야 하는 부분이 있다면 Qt의 단일화된 인터페이스로 여러가지 DB에대해서 일관된 인터페이스로 처리할 수 있도록 되어 있습니다.(ODBC와 같은 개념) 따라서 DB관련 처리부분에 있어서도 이를 적극활용하면 각각의 DB마다 조금씩 다른 특성을 Qt의 하나의 일관된 스타일로 처리할 수 있습니다.

2.2.4 기타 Helper class(Date, Time, STL등)
GUI 프로그램을 작성하다보면 현재시간을 구해서 시간차이를 계산하는 경우, Queue, List등의 자료구조를 이용해야 하는일이 빈번합니다. 이러한 것 역시 여러가지 형태의 클래스로 제공을 하고 있습니다.
Qt의 STL의 경우에는 Standard Template Library와 성능에 있어서는 조금 비효율적일 수 있으나 MFC의 afxtempl.h 에 정의된 Template Library와 같은 이유에서 존재하고 있습니다.(여러가지 의견이 있을 수 있으나 필자의 견해로는 Naming Notation등을 맞추어서 깔끔하게 처리할 수 있다는 점과 STL에서 제공하지 못하는 추가적인 기능을 부여해서 편하게 하는데 있다고 생각합니다.
Standard STL의 경우 알고리즘의 효율을 위해서 편리성보다는 성능을 중시하는 방면(가령, std::vector에서는 MFC의 CArray처럼 가운데 삽입자체가 불가능) 일반 응용프로그램 작성에 있어서 vector의 가운데 삽입으로 인한 성능저하가 쉽게 일어나지 않는점을 반영한 지원의 경우가 있을 수 있다고 생각합니다. )
위와같이 Qt의 각 요소들을 살펴보았다면 실제 개발에 있어서의 활용범위를 정하고 이를 적극적으로 이용하는 것이 타당하다고 생각합니다. 이미 자신만이 가진 솔루션이 있다고 할지라도 이미 많은 사람들에 의해서 검증되고 있는 부분을 적용하는 것이 현명한 생각이라고 봅니다.
가령 내가 대학교다닐적 linked list 알고리즘을 배우고 구현했던 그대로를 제품 그대로 적용하는것과 잘 만들어진 std::list 를 적용하는 문제와 같다고 봅니다.
또하나의 예를들면 아래와 같은 두개의 예제코드를 보면
예1)
int fd = ::open(“/xxx.dat”, …);
/// 처리…
close(fd);
예2)
QFile f;
f.open(“/xxx.dat”, …);
위와같이 두가지 예제는 언뜻보면 별 차이도 없고 Qt로 해도 무슨관계가 있냐고 하실지 모르겠지만 예2)와 같은 코드는 프로그램을 안전하게 만들어 줍니다.
예1)의 상황윽 open과 close로 항상 pair로 동작되어야 안전합니다. 하지만 만약, open을 해서 handle을 얻은후 각종 if등의 제어구조 때문에 close함수를 처리못하는 버그가 있고 이를 발견하지 못한체 계속 수행된다면 handle leak으로 인해 프로그램이 정상적으로 수행되지 못하는 불운의 사태를 맞이하게 됩니다.(실제로 이 문제 때문에 엄청 고생한적이 있습니다.)
하지만 예2)의 경우 설령 open뒤에 제어구조로 인해 close를 호출못했다고 할지라도 QFile 의 destructor에서 자동으로 close()를 호출하므로 절대 handle leak이 발생하지 않을 것입니다.
간단한 차이지만 이러한 차이점들이 실제 제품개발에 있어서 최종 제품 양산직전에 고생하게 만드는 골치로 작용될 것 입니다. 비록 간단한 예이지만 Qt의 잘 설계된 클래스들은 우리가 직접 설계한 그것보다 system call원형호출보다 실 수할 가능성을 줄여줍니다.

자료 출처
korone.net programming 사이트를 운영하고 계시는 조병완님의 글, 세 번째 시간
"[03] Embedded C++ GUI Programming with Qt - Qt의 기능 및 활용전략" 입니다.

Thursday, July 22, 2010

New Linux Command I have Learn

echo $PATH
echo $SHELL

to insert path in Ubuntu
edit /etc/environment text file.

How to install arm v6 compiler?

1. decompress the armv6.tar.gz under /opt
2. its directory name is armv6

tar xvjf armv6_codesourcery.tar.bz2 -C /opt/

# su account
$ vi ~/.bash_profile
export PATH=/opt/armv6/codesourcery/bin:$PATH

$reboot
# arm-none-linux-gnueabi-gcc -v ( confirm the version number )

in ubuntu
cat > ~/.bash_profile
PATH=$HOME:/opt/armv6/codesourcery/bin:$PATH
export PATH
ctrl+D

How to share beween Host Windows and Guest Ubuntu?

1. Select Shared Folder in virtual box menu
2. click the add button and then add folder you want in windows. you can read/write files in this folder from your guest ubuntu folder.
3. And now, in Guest OS, Ubuntu, you must do the mount operation like the following
first go to the /mnt directory and create directory named share and run the command.
mount -t vboxsf 'shared-folder name' ./share


http://myknowledge.kr/90?srchid=BR1http%3A%2F%2Fmyknowledge.kr%2F90