Tag: Linux

Linux下如何查看CPU信息, 包括位数和多核信息

Posted by – May 5, 2010

Linux下如何查看CPU信息, 包括位数和多核信息

# uname -a

Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux

(查看当前操作系统内核信息)

# cat /etc/issue | grep Linux

Red Hat Enterprise Linux AS release 4 (Nahant Update 5)

(查看当前操作系统发行版信息)

# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

8  Intel(R) Xeon(R) CPU            E5410   @ 2.33GHz

(看到有8个逻辑CPU, 也知道了CPU型号)

# cat /proc/cpuinfo | grep physical | uniq -c

4 physical id      : 0

4 physical id      : 1

(说明实际上是两颗4核的CPU)

# getconf LONG_BIT

32

(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

# cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l

8

(结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit)

更多信息:
dmidecode -t 4
More info about dmidecode:
man dmidecode

Linux上运行Windows下的游戏

Posted by – May 4, 2010

很多在Windows下运行的游戏能通过特殊的兼容性程序如WineCedega来在Linux下运行。

  1. For information about Wine, see the Ubuntu wiki.
  2. For information about Cedega, see the Ubuntu wiki. See the Cedega CVS Howto for instructions on compiling and installing Cedega.

Wine:
https://help.ubuntu.com/community/Wine

Cedega:
https://help.ubuntu.com/community/Cedega

用grub命令行启动系统

Posted by – April 27, 2010

Refers to:
http://17610376.blog.51cto.com/366886/116208
前些天fedora的启动菜单grub.conf丢失,无法进入系统。不过,grub启动管理器还好好的,只好通过grub命令行来手动引导启动系统了。
在“从硬盘安装fedora 8 ”中曾经稍微提到过,grub是一个多系统的启动管理器,不但有linux版本的grub,也有windows版本的grub。上次从硬盘安装系统用的就是windows版本的grub。可以说,grub是一个非常强大的多系统启动管理器,具有多重系统引导,交互式操作,可设置grub启动密码,可映射硬盘,可以定制开机画面等等特点。通过命令行启动系统就是交互式操作的一个应用,至于其它应用,这里就不再一一列出。想要深入了解它的话,可以看一下grub的手册: [url]http://www.linuxsir.org/main/doc/grub/grubmanual/index.html[/url] 。说来惭愧,我还没完全看过。。哈哈。。
闲话少说,先把通过命令行启动系统的过程列出来。为了解释方便,特标上行号:
1 root (hd0,2)
2 kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
3 initrd /initrd-2.6.26.5-28.fc8.img
4 boot
怎么样?linux的启动命令行是不是很简洁啊?下面就一一解释这几命令。
第1行命令:指定/boot所在的分区。
要是不知道自己的/boot分区在哪里,没关系,先输入root (hd0,然后按Tab键,它会显示可能的分区,然后根据分区类型判断/boot分区。我就是这么做的……所以Tab键是linux里很好用的一 个键。这里指定/boot分区并不是必须的,在这里省略的话要在kernel以及initrd中指定,即:kernel (hd0,2)/vmlinuz-2.6……和initrd (hd0,2)/initrd-2.6……
关 于”hd0,2”,是指第一块硬盘的第三个分区,这是一个主分区。linux里的分区表示方法有两种:一是像”hd0,2″这种纯数字表示法,它是 以”hd0,0″开始,意思是第一块硬盘的第一个分区;第二块硬盘就是hd1。还有一种是hda1这一种,它也表示第一块硬盘的第一个分区;第二块硬盘就 是hdb。两种表示法用在不同的场合,纯数字表示法一般用在grub中指定/boot分区;第二种方法是日常使用的表示法,硬盘挂载等都用这种表示法。关于主分区与扩展分区,这里稍微提一点:扩展分区是从hdx5或hdx,4开始的,其中x代表硬盘号。要更加详细的了解linux的分区表示法,Google一下。

第2行命令:指定内核映像及根分区。
输入kernel /vmlinuz,然后按Tab键补全内核映像全名;补全以后可以看到我的fedora内核映像是vmlinuz-2.6.26.5-28.fc8。如果 有一个以上的内核,它会全部显示出来让你选择(这种情况遇到过,从8升级到9以后,我的启动菜单里就有了两个映像)。还有就是,我的/boot分区不是在 根分区中,而是一个独立的分区;如果/boot分区不是一个独立分区,而是位于根分区中,就要这样写: kernel /boot/vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet,下面的initrd要写成:initrd /boot/initrd-2.6.26.5-28.fc8.img。映像后面的部分是用来指定根分区的,要手动输入。ro的意思是read only,root=/dev/VolGroup00/LogVol00是根分区位置,rhgb意思是图形化启动过程,quiet意思是不要显示启动信 息。在实际操作中,我发现内核映像以后的部分其实不是必须的;也就是说,即使不输入这部分内容,不指定根分区,不指定图形化启动过程,不省略启动信息,也 可以正确启动。对于不必指定根分区,是否跟我的系统是单内核有关系?
这行命令要多理解一下。首先,vmlinuz中,vm是指vritual memery,linuz的意思是说,这一个经过压缩的内核映像。还有,这一行命令中的root跟第一行命令中的root表达的不是同一意思。第一行命令 中的root指的是系统的启动分区,即/boot分区;第二行命令中的root指的是系统的根分区,即/分区。要详细理解两者的区别,就牵涉到linux 文件系统及目录结构,它是linux中关键性的概念之一,我会找个时间写一些关于它东西,浅谈一下我对它的理解。”root=”后面的”/dev /VolGroup00/LogVol00″就是根分区的位置;看起来是不是怪怪的?因为我的根分区用的不是普通的硬盘分区,而是逻辑卷,术语叫 LVM(logical volume manager)。这个也是linux里一个很重要的东西。LVM要结合linux硬盘分区及目录结构来理解,这里就不谈了,否则会越扯越远,偏离正题。

第3行命令:指定initrd.img
initrd即initial ramdisk,字面上理解是初始化RAM磁盘。它实际上是一个临时的文件系统,而且是与内核绑定在一起的。一般用来加载必须的系统文件、驱动程序和存储 设备等,系统启动以后它立刻被释放。据说,在没有其它存储设备的情况下,它就是永久的系统。我不是太了解,也写不出更多的东西来。总 之,initrd.img是一个与内核绑定在一起的,用来加载必须的系统文件的临时文件系统。

第4行命令:启动系统。输入boot,敲回车键即可启动系统。
系统启动以后,再想一下这个手动启动的过程,如果了解grub的话,手动启动系统并不复杂。而启动菜单呢,很像是根据我们手动输入的内容编写而成的一个脚本。这个“脚本”让你在启动系统时不必每次都手动输入,所以这个“脚本”还是很有用的,我们还是手动编写一个吧。
若了解linux目录结构的话,就会知道启动菜单在根分区的boot文件夹下的grub文件夹中。grub文件夹中还有一个menu.lst,它是grub.conf的链接文件。你可能有点疑问:你的/boot分区不是一个独立的分区,不在根分区中么?其实这就是linux与windows不同的地方之一,它是通过挂载的方式与根分区产生关系的,这牵涉到文件系统和目录结构方面的东西,这里不详谈。找到并打开grub文件夹,创建一个grub.conf,你需要root权限!

grub.conf该怎么写呢?和上面输入的命令基本相似。下面是我虚拟机中fedora的grub.conf的内容:

其中,加#号的都是注释文字,启动时是被忽略的。核心部分如下:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title Fedora (2.6.26.5-28.fc8)
root (hd0,0)
kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.26.5-28.fc8.img
第一行,default项,表示默认启动的系统。0代表按照grub中 的顺序默认启动第一个系统,改为1,则是默认启动第二个系统。以此类推。第二行,timeout项,表示选择菜单等待时间为5秒。这个可以自己设定选择菜 单等待的时间。第三行,splashimage项,表示开机启动时出现的背景画面。若不想让画面显示,可以在前面加#号以忽略。第四 行,hiddenmenu项,表示隐藏选择菜单,加#号表示不隐藏。若装了双系统又不想让它出现选择菜单,可以把前面的#号去掉。第五行,title项, 选择菜单上出现的系统标题。下面的就不用再解释了。。。
仿照这个grub.conf 另外写一个启动菜单,注意我实际电脑中的/boot分区是(hd0,2),其它的完全照搬。然后把它放在/boot/grub中,就可以正常启动 fedora了。但是我的实际的电脑中装的是xp和fedora双系统,按照那个启动菜单虽然可以正常启动fedora,却不能正常启动xp,仍然需要手 动输入。所还需要在刚才的启动菜单尾部加上一部分:
title windows xp
rootnoverify (hd0,0) #我实际电脑中xp系统是放在第一个分区中的
chainloader +1
若想让xp系统默认启动,把default项改为1。xp这一部分的启动菜单用了链式装入器,也不必理会什么意思,照搬就可以了。
现在一份新的启动菜单就弄好了!
这篇日记算是勉强写完了。一方面,我也不是特别了解grub,无法作更深入的挖掘;另一方面,这篇日记牵涉到很多linux文件系统、目录结构、硬盘分区等知识。既要谈一点这方面的知识,否则读起来会很吃力;又不能谈的过多,否则会偏离正题。但是不管怎么说,用命令行启动fedora是没什么问题了……

Linux系统调用列表

Posted by – April 16, 2010

Linux系统调用列表:

Refers to:
http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#2

2002 年 3 月 01 日

本文列出了大部分常见的Linux系统调用,并附有简要中文说明。

以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的 Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。

按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统 调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释。

其中有一些函数的作用完全相同,只是参数不同。(可能很多熟悉C++朋友马上就能联想起函数重载,但是别忘了Linux核心是用C语言写的,所以只能取成 不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数我会在前面 标上“*”号以示区别。

一、进程控制:

fork 创建一个新进程
clone 按指定条件创建子 进程
execve 运行可执行文件
exit 中 止进程
_exit 立即中止当前进程
getdtablesize 进 程所能打开的最大文件数
getpgid 获取指定进程组标识号
setpgid 设 置指定进程组标志号
getpgrp 获取当前进程组标识号
setpgrp 设 置当前进程组标志号
getpid 获取进程标识号
getppid 获 取父进程标识号
getpriority 获取调度优先级
setpriority 设 置调度优先级
modify_ldt 读写进程的本地描述表
nanosleep 使 进程睡眠指定的时间
nice 改变分时进程的优先级
pause 挂 起进程,等待信号
personality 设置进程运行域
prctl 对 进程进行特定操作
ptrace 进程跟踪
sched_get_priority_max 取 得静态优先级的上限
sched_get_priority_min 取得静态优先级的下限
sched_getparam 取 得进程的调度参数
sched_getscheduler 取得指定进程的调度策略
sched_rr_get_interval 取 得按RR算法调度的实时进程的时间片长度
sched_setparam 设置进程的调度参数
sched_setscheduler 设 置指定进程的调度策略和参数
sched_yield 进程主动让出处理器,并将自己等候调度队列队 尾
vfork 创建一个子进程,以供执行新程序,常与execve等同时使用
wait 等 待子进程终止
wait3 参见wait
waitpid 等 待指定子进程终止
wait4 参见waitpid
capget 获 取进程权限
capset 设置进程权限
getsid 获 取会晤标识号
setsid 设置会晤标识号

回页首

二、文件系统控制

1、文件读写操作

fcntl 文件控制
open 打开文件
creat 创 建新文件
close 关闭文件描述字
read 读 文件
write 写文件
readv 从文件 读入数据到缓冲数组中
writev 将缓冲数组里的数据写入文件
pread 对 文件随机读
pwrite 对文件随机写
lseek 移 动文件指针
_llseek 在64位地址空间里移动文件指针
dup 复 制已打开的文件描述字
dup2 按指定条件复制文件描述字
flock 文 件加/解锁
poll I/O多路转换
truncate 截 断文件
ftruncate 参见truncate
umask 设 置文件权限掩码
fsync 把文件在内存中的部分写回磁盘

2、文件系统操作

access 确定文件的可存取性
chdir 改变当前 工作目录
fchdir 参见chdir
chmod 改 变文件方式
fchmod 参见chmod
chown 改 变文件的属主或用户组
fchown 参见chown
lchown 参 见chown
chroot 改变根目录
stat 取 文件状态信息
lstat 参见stat
fstat 参 见stat
statfs 取文件系统信息
fstatfs 参 见statfs
readdir 读取目录项
getdents 读 取目录项
mkdir 创建目录
mknod 创 建索引节点
rmdir 删除目录
rename 文 件改名
link 创建链接
symlink 创 建符号链接
unlink 删除链接
readlink 读 符号链接的值
mount 安装文件系统
umount 卸 下文件系统
ustat 取文件系统信息
utime 改 变文件的访问修改时间
utimes 参见utime
quotactl 控 制磁盘配额

回页首

三、系统控制

ioctl I/O总控制函数
_sysctl 读/写系 统参数
acct 启用或禁止进程记账
getrlimit 获 取系统资源上限
setrlimit 设置系统资源上限
getrusage 获 取系统资源使用情况
uselib 选择要使用的二进制函数库
ioperm 设 置端口I/O权限
iopl 改变进程I/O权限级别
outb 低 级端口操作
reboot 重新启动
swapon 打 开交换文件和设备
swapoff 关闭交换文件和设备
bdflush 控 制bdflush守护进程
sysfs 取核心支持的文件系统类型
sysinfo 取 得系统信息
adjtimex 调整系统时钟
alarm 设 置进程的闹钟
getitimer 获取计时器值
setitimer 设 置计时器值
gettimeofday 取时间和时区
settimeofday 设 置时间和时区
stime 设置系统日期和时间
time 取 得系统时间
times 取进程运行时间
uname 获 取当前UNIX系统的名称、版本和主机等信息
vhangup 挂起当前终端
nfsservctl 对 NFS守护进程进行控制
vm86 进入模拟8086模式
create_module 创 建可装载的模块项
delete_module 删除可装载的模块项
init_module 初 始化模块
query_module 查询模块信息
*get_kernel_syms 取 得核心符号,已被query_module代替

回页首

四、内存管理

brk 改变数据段空间的分配
sbrk 参见brk
mlock 内 存页面加锁
munlock 内存页面解锁
mlockall 调 用进程所有内存页面加锁
munlockall 调用进程所有内存页面解锁
mmap 映 射虚拟内存页
munmap 去除内存页映射
mremap 重 新映射虚拟内存地址
msync 将映射内存中的数据写回磁盘
mprotect 设 置内存映像保护
getpagesize 获取页面大小
sync 将 内存缓冲区数据写回硬盘
cacheflush 将指定缓冲区中的内容写回磁盘

回页首

五、网络管理

getdomainname 取域名
setdomainname 设 置域名
gethostid 获取主机标识号
sethostid 设 置主机标识号
gethostname 获取本主机名称
sethostname 设 置主机名称

回页首

六、socket控制

socketcall socket系统调用
socket 建 立socket
bind 绑定socket到端口
connect 连 接远程主机
accept 响应socket连接请求
send 通 过socket发送信息
sendto 发送UDP信息
sendmsg 参 见send
recv 通过socket接收信息
recvfrom 接 收UDP信息
recvmsg 参见recv
listen 监 听socket端口
select 对多路同步I/O进行轮询
shutdown 关 闭socket上的连接
getsockname 取得本地socket名字
getpeername 获 取通信对方的socket名字
getsockopt 取端口设置
setsockopt 设 置端口参数
sendfile 在文件或端口间传输数据
socketpair 创 建一对已联接的无名socket

回页首

七、用户管理

getuid 获取用户标识号
setuid 设置用户标 志号
getgid 获取组标识号
setgid 设 置组标志号
getegid 获取有效组标识号
setegid 设 置有效组标识号
geteuid 获取有效用户标识号
seteuid 设 置有效用户标识号
setregid 分别设置真实和有效的的组标识号
setreuid 分 别设置真实和有效的用户标识号
getresgid 分别获取真实的,有效的和保存过的组标识号
setresgid 分 别设置真实的,有效的和保存过的组标识号
getresuid 分别获取真实的,有效的和保存过的用 户标识号
setresuid 分别设置真实的,有效的和保存过的用户标识号
setfsgid 设 置文件系统检查时使用的组标识号
setfsuid 设置文件系统检查时使用的用户标识号
getgroups 获 取后补组标志清单
setgroups 设置后补组标志清单

回页首

八、进程间通信

ipc 进程间通信总控制调用

1、信号

sigaction 设置对指定信号的处理方法
sigprocmask 根 据参数对信号集中的信号执行阻塞/解除阻塞等操作
sigpending 为指定的被阻塞信号设置队 列
sigsuspend 挂起进程等待特定信号
signal 参 见signal
kill 向进程或进程组发信号
*sigblock 向 被阻塞信号掩码中添加信号,已被sigprocmask代替
*siggetmask 取得现有阻塞 信号掩码,已被sigprocmask代替
*sigsetmask 用给定信号掩码替换现有阻塞信 号掩码,已被sigprocmask代替
*sigmask 将给定的信号转化为掩码,已被 sigprocmask代替
*sigpause 作用同sigsuspend,已被 sigsuspend代替
sigvec 为兼容BSD而设的信号处理函数,作用类似 sigaction
ssetmask ANSI C的信号处理函数,作用类似sigaction

2、消息

msgctl 消息控制操作
msgget 获取消息队列
msgsnd 发 消息
msgrcv 取消息

3、管道

pipe 创建管道

4、信号量

semctl 信号量控制
semget 获取一组信号量
semop 信 号量操作

5、共享内存

shmctl 控制共享内存
shmget 获取共享内存
shmat 连 接共享内存
shmdt 拆卸共享内存

参考资料

  • Linux man pages
  • Advanced Programming in the UNIX Environment, W. Richard Stevens, 1993

QT手册& 汉化Chinesize

Posted by – January 5, 2010

QT手册& 汉化Chinesize:
http://blog.chinaunix.net/u/26313/showart_213711.html

嵌入式工具Qt的安装与使用
——————————————————————————–

摘要
Qt是Trolltech公司的一个产品。Trolltech是挪威的一家软件公司,主要开发两种产品:一种是跨平台应用程序界面框架;另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备上。Qt和 Qtopia分别是其中具有代表性的两个。

By lanf, 出处:http://tech.ccidnet.com/pub/article/c310_a71173_p1.html

作者:胡利民 本文选自:开放系统世界

Qt是Trolltech公司的一个产品。Trolltech是挪威的一家软件公司,主要开发两种产品:一种是跨平台应用程序界面框架;另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备上。Qt和Qtopia分别是其中具有代表性的两个。

Qt是一个多平台的C++图形用户界面应用程序框架,它能给用户提供精美的图形用户界面所需要的所有元素,而且它是基于一种面向对象的思想,所以用户对其对象的扩展是相当容易的,并且它还支持真正的组件编程。

Qt是Linux桌面环境KDE的基础。笔者认为,可以说Qt与Windows下的Mfc的实质是一样的,所以Qt最大的优点在于其跨平台性,可以支持现有的多种操作系统平台,主要有:

◆ MS/Windows 95、Windows 98、WindowsNT 4.0、Windows 2000、Windows XP;

◆ Unix/X11 Linux、Sun Solaris、HP-UX、Compaq True64Unix、IBM AIX、SGI IRIX和很多其它X11平台;

◆ Macintoshi Mac OSX;

◆ Embedded—带FramBuffer的Linux平台。

下面简单介绍一下Qt/Embedded和Qtopia在Linux上的安装和使用,还有在开发过程中可能碰到的一些问题。

Qt 和Qtopia的安装

如果需要安装一个带FramBuffer的Qtopia平台,需要有以下软件(所列举软件以笔者使用的为例):

◆ Qtopia 1.6.0;

◆ Tmake 1.11;

◆ Qt/Embedded 2.3.4(Qtopia 1.6.0是基于该开发平台上开发的);

◆ Qt/Embedded 2.3.2 for X11;

◆ Qt 3.1.2 for X11。

在Trolltech公司的网站上可以下载该公司所提供的Qt/Embedded的免费版本。

Qtopia平台安装分为以下几个步骤:

1. 解包Qtopia

在Linux命令模式下运行以下命令:

tar xfz qtopia-source-1.6.0 (解包)
cd qtopia-source-1.6.0
export QPEDIR=$PWD (设置环境变量)
cd..

2. 安装Tmake

在Linux命令模式下运行以下命令:

tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH

3. 安装Qt/Embedded2.3.4

在Linux命令模式下运行以下命令:

tar xfz qt-embedded-2.3.4-commercial.tar.gz
cd qt-2.3.4
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
. /configure -qconfig qpe -qvfb -depths 4,8,16,32
make sub-src
cd ..

也可以在configure的参数中添加-system-jpeg和gif,使Qtopia平台能支持jpeg、gif格式的图形。

4. 安装Qt/X11 2.3.2

在Linux命令模式下运行以下命令:

tar xfz qt-x11-2.3.2-commercial.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
. /configure -no-opengl
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..

根据开发者本身的开发环境,也可以在configure的参数中添加别的参数,比如-no-opengl或-no-xfs,可以键入./configure -help来获得一些帮助信息。

5. 安装Qt/X11 3.1.2

在Linux命令模式下运行以下命令:

tar xfz qt-x11-commercial-3.1.x.tar.gz
cd qt-x11-commercial-3.1.x
export QTDIR=$PWD
export QT3DIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -thread
make
cd ..

6. 安装Qtopia

在Linux命令模式下运行以下命令:

cd qtopia-source-1.6.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
cd src
./configure
make
cd ../..

7. 安装Qtopia桌面

cd qtopia-source-1.6.x/src
export QTDIR=$QT3DIR
./configure -qtopiadesktop
make
mv qtopiadesktop/bin/qtopiadesktop ../bin
cd ..

Qt和Qt Designer的使用
——————————————————————————–
根据上面的步骤安装完成了Qt/Embedded和Qtopia之后,就可以运行这些程序了。

运行Qt的虚拟仿真窗口:在Linux的图形模式下运行命令qvfb&;Qtopia只是一个用Qt/Embedded开发的程序,运行Qtopia,在图形模式下运行命令:

export QTDIR=$QTEDIR,
qpe &;

这样Qtopia的程序就运行在QVFB上,即Qt的虚拟仿真窗口。

Qt/Embedded是针对嵌入式Linux而开发的一种开发工具,Qt封装了一些常用的类,而且这些类的名字都以Q字开头命名,如QString、QDialog等。这里主要介绍一下如何利用Qt Designer来设计组件,并生成相应的代码。

在Qt中,把组件分为复合体、原始体和配件。而在Qt中,组件是由一些抽象类、复杂的组件类、管理组件几何特性的类等组成。

Qt中有三个主要的基类:QObject、Qapplication和QWidget。

在Qt 中编程,利用Signal和Slot进行对象之间的通信是Qt的主要特征。它与Windows中的消息机制非常类似,但是Signal和Slot机制真正实现了一种消息的封装。当对象的状态改变时,发出Signal,通知所有的Slot接受Signal,尽管它不知道哪些函数是Slot,Slot一开始也不知道哪些Signal可以接收。Signal和Slot之间不是一一对应的关系,一个Signal可以发给多个Slot, Slot也可以接收多个Signal。Slot除了可以接收Signal以外,与其它的成员函数没有区别。这种机制比使用回调函数要灵活,但是会减慢程序的运行速度。不过在现在高速CPU的面前,这种损失是无足轻重的,而且它还能保证程序的简明性和灵活性,非常便利。

在Qt的组件中,不仅定义了常用的成员变量和成员函数,还定义了所有与该组件相关的Signal和Slot。

要将组件组合起来,最简单的方法就是使用Qt Designer。首先要启动Qt Designer,在Linux命令模式下,键入以下命令(假设Qt安装在/usr/local下):

cd qt-2.3.2/bin
./designer

这样就可以启动一个与Windows下的Delphi相类似的界面。

然后新建一个QFrame,将自己需要的组件直接拖拉到这个Frame中,相信很多人都有过这样的经历,此处就不再详细描述了。完成之后存盘时,会将这个新的组件保存为一个扩展名为.ui的文件。假设所存的文件名为test.ui,用vi test.ui来查看这个文件,发现这是一个用xml语言写的一个文本。下面用这个test.ui生成相应的test.h和test.cpp。同样还是在这个目录下,可以看到一个uic的工具,这个是Qt专门用来将ui文件生成.h和.cpp文件的,在终端模式下键入以下命令:

./uic -o test.h test.ui
./uic -o test.h -i test.cpp test.ui

此时就能看到生成了相应test.h和test.cpp,这是一个类。当然这只是一些表面的东西,还需要在这些代码中添加相应的Signal和Slot,完成所需要的操作。值得注意的是,相应版本生成的ui最好用相应版本的uic来生成代码。如果用Qt 3.1.2的Designer生成的ui,用Qt 2.3.2的uic来生成代码,生成的代码都会是一些空函数。

在一般的开发过程中,首先通过这个ui生成的一个类,在Qt中通常叫做 Base,如上面的例子,叫做testBase;然后再新建一个类,来继承这个Base。通常叫做实现类Impl,如testImpl。在这个实现类里面定义所需要的成员函数、Signal和Slot,因为ui可能是经常需要改动的。如果这样做,每次只需要在Designer中修改ui,而不用去理会这些成员函数、Signal和Slot了。

编译一个Qt程序必然需要Makefile,在Qt中提供了一个专门生成Makefile的工具,就是tmake。用tmake需要根据编写的程序写一个.pro文件。.pro文件非常简单,有固定的格式,下面是一个例子:

TEMPLATE = app
CONFIG = qtopia warn_on release
MOC_DIR =tmp
OBJECTS_DIR =tmp
HEADERS =fcrs.h\
structs.h \
globalfunc.h \
globalvars.h \
testimpl.h
SOURCES = main.cpp \
globalfunc.cpp\
globalvars.cpp \
testimpl.cpp
INTERFACES = test.ui \
TARGET = fcrs

生成这个.pro文件之后,在终端中键入下面的命令:

tmake -o Makefile test.pro

就自动生成了一个Makefile,使用这个Makefile编译所编写的程序就可以了。

Qt/Embedded开发环境建立的过程
——————————————————————————–

Qt/Embedded开发环境建立的过程:
(这些软件可以免费从trolltech的WEB或FTP服务器上下载)
◆ tmake 1.11 或更高版本; (生成Qt/Embedded应用工程的Makefile文件)
◆ Qt/Embedded 2.3.7 (Qt/Embedded 安装包)
◆ Qt 2.3.2 for X11; (Qt的X11版的安装包, 它将产生x11开发环境所需要的两个工具)
1、安装tmake
在Linux 命令模式下运行以下命令:
tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH
2. 安装Qt/Embedded 2.3.7
在Linux 命令模式下运行以下命令:
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -qconfig -qvfb -depths 4,8,16,32
make sub-src
cd ..
上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定Qt 嵌入式开发包生
成虚拟缓冲帧工具qvfb,并支持4,8,16,32 位的显示颜色深度。另外我们也可以在
configure 的参数中添加-system-jpeg 和gif,使Qt/Embedded 平台能支持jpeg、gif
格式的图形。
上述命令 make sub-src 指定按精简方式编译开发包,也就是说有些Qt 类未被编
译。Qt 嵌入式开发包有5 种编译范围的选项,使用这些选项,可控制Qt 生成的库文件的大
小,但是您的应用所使用到的一些Qt 类将可能因此在Qt 的库中找不到链接。编译选项的具
体用法可运行./configure -help 命令查看。
3. 安装Qt/X11 2.3.2
在Linux 命令模式下运行以下命令:
tar xfz qt-x11-2.3.2.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-opengl
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..
根据开发者本身的开发环境,也可以在configure 的参数中添加别的参数,比如
-no-opengl 或-no-xfs,可以键入./configure -help 来获得一些帮助信息。
如果Qt/Embedded 的应用是在UNIX 平台下开发的话,那么它就可以在开发的机器
上以一个独立的控制台或者虚拟缓冲帧的方式来运行,对于后者来说,其实是有一个X11
的应用程序虚拟了一个缓冲帧。通过指定显示设备的宽度,高度和颜色深度,虚拟出来
的缓冲帧将和物理的显示设备在每个像素上保持一致。这样每次调试应用时开发人员就
不用总是刷新嵌入式设备的FLASH 存储空间,从而加速了应用的编译、链接和运行周期。
运行Qt 的虚拟缓冲帧工具的方法是:在Linux 的图形模式下运行命令:
qvfb (回车)
当Qt 嵌入式的应用程序要把显示结果输出到虚拟缓冲帧时,我们在命令行运行这
个程序时,在程序名后加上-qws 的选项。例如: $> hello -qws

一,QT/E的安装。
——————————————————————————–
在本机中安装了包括QT4.0.1(WINDOWS版本)以及QT/E2。3。7(LINUX版本)。
QT/E我安装在我的虚拟机中。因为QT/E2.3.7的版本问题,其适宜在REDHAT9。0版本(或更低版本)下安装,否则安装不成功。
QT/E安装过程复杂,具体细节可以参考下面这篇文章。《Qt/Embedded开发环境建立的过程》
此文在网上可搜索到。

本机下虚拟机中QT/E安装路径为:/home/wangxl/QTE/qt-2.3.7
QT/X11安装路径为:/home/wangxl/QTE/qt-2.3.2
Tmake安装路径为:/home/wangxl/QTE/Tmake-1.8

QT/E下载地址为:ftp://ftp.rediris.es/mirror/Qt/source/
Tmake下载地址为:ftp://ftp.trolltech.com/freebies/tmake/

二.QT与QT/E以及QT3与QT4之间的区别
——————————————————————————–
相对来说QT与QT/E的语法一样,所不同之处在库类大小或者库类函数大小不同而已。QT/E相对于QT来说,不具有少数类或者少数函数的支持。具体QT/E是否包含某个类或者包含某个类中的函数,我的方法是在QT/E安装目录下的include文件夹中去查找。
QT3和QT4有很多不同点,主要不同也是在于库类以及支持函数有所变化,比如,有些QT3中的函数,在QT4中被其他函数名所代替,因此很多QT4程序在QT3环境下无法执行。QT/E2.3.7与QT3基本相同,除了我前面提到的QT与QT/E的差别。

三.QT/E编译与执行。
——————————————————————————–
1.在QT/E编译与执行前要先设置TMAKE与QT/E LIB环境,具体方法如下:
[root@localhost tmake-1.8]# export TMAKEDIR=$PWD
[root@localhost tmake-1.8]# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
[root@localhost tmake-1.8]# export PATH=$TMAKEDIR/bin:$PATH
[root@localhost qt-2.3.7]# export QTDIR=$PWD
[root@localhost qt-2.3.7]#export QTEDIR=$QTDIR
[root@localhost qt-2.3.7]#export PATH=$QTDIR/bin:$PATH
[root@localhost qt-2.3.7]#export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

2.如果你是用DESIGNER工具设计的界面(后面有讲),则要将*.ui文件转换成*.h文件和*.cpp文件。转换方法如下:
uic –o test.h test.ui
uic –o test.cpp –i test.h test.ui

3.编写一个*.pro文件(用来生成Makefile文件用),该文件格式比较固定。
如test.pro文件基本格式如下(以test.cpp ,test.h main.cpp为例子):
EMPLATE = app
CONFIG += qt warn_on release
HEADERS = test.h
SOURCES = test.cpp \
main.cpp
TARGET = hello
DEPENDPATH=/home/wangxl/QTE/qt-2.3.7/include
REQUIRES=

4.生成Makefile文件
方法为:tmake –o Makefile test.pro
5 编译生成可执行文件
make

6 打开QVFB
进入安装QT/X11所在目录, 在BIN目录下执行程序qvfb。
有时候需要修改qvfb执行时的deptb参数才能够执行QT/E程序。可以直接在QVFB打开窗口的Configure彩单项中选择,也可以用如下命令执行QVFB。
./qvfb –width ** -height ** -depth **
7.执行QT/E程序
如 。/TEST
在QVFB程序打开的窗口中将出现TEST程序的显示 。

四.Qt/e与QT/X11
——————————————————————————–
安装QT/E的同时还需要安装QT/X11与Tmake,Tmake 是用来帮助生成Makefile文件的。安装QT/X11主要是向QT/E提供designer工具和qvfb工具的。
Designer可以用来设计图形界面,最后生成.ui文件,可通过UIC命令转换为相应的C++文件。
QVFB模拟帧缓冲,提供QT/E程序的显示平台。

五.QT/E 程序ARM 板上执行
——————————————————————————–
在我虚拟机上可以执行的QT/E程序不能在ARM板上执行,需要对QT/E进行重新编译,并需要设置响对于ARM板系统的编译环境,具体方法可以参考我另外的一文《QT/E开发记录》

六.QT/E支持中文显示问题
——————————————————————————–
QT/E需要字体转换才能显示中文。具体方法可以参考我另外的一文《QT/E开发记录》
但是由于缺少UNICODE的QPF文件的字体,中文字大小不均匀问题尚没解决。

七 QT/E的一些参考资料:
——————————————————————————–
http://www.qtcn.org/bbs/index.php QT中文论坛
http://www.qiliang.net/qt/ (关于QT3的类,以及类函数可以在这寻找)
提供QT3编程最好书籍的电子版本《C++ GUI Programming with QT 3》(本机)
关于QT4可以参考QT ASSISTNAT(本机中),另外QT ASSISTNAT中也可以查找QT3的类及库等。

设置Qtopia的build环境
——————————————————————————–
1、环境变量
在目标系统上build Qtopia必须设定必要的环境变量,如QTDIR, 如果依赖多个版本的Qt,则需要用环境变量指向用到的库配置。
一种方法是将环境变量的设定写入文件,通过运行source命令应用文件的内容。

举例说明:
Linux/bash下建立环境变量设定文件qtopia.sh, 内容如下:
export QPEDIR=/opt/Qtopia
export QTDIR=/opt/Qtopia
export PATH=$QTDIR/bin:$PATH
export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-generic-g++
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

需要时运行 source qtopia.sh即可应用以上环境变量。

另外也可以通过在.bashrc文件中设定别名来应用这些环境变量。 假设环境变量设置文件存放在home目录的bin下, 则可在.bashrc中加入:
alias qtopia=’source ~/bin/qtopia.sh’

2、创建自定义的配置文件

整个Qtopia系统在build过程中需要三个独立的配置系统:
1) Qt/Embedded 配置文件
2) tmake – 用于build Qtopia 1.x和一些第三方软件
3) qmake – 用于build Qtopia 2及以上版本

在build Qtopia以前,先要完成以上三项的配置。

下面是创建一个“myarm”配置的例子:
cp -r $TMAKEDIR/lib/qws/linux-arm-g++ $TMAKEDIR/lib/qws/linux-myarm-g++
cp -r $QTEDIR/configs/linux-arm-g++-shared $QTEDIR/configs/linux-myarm-g++-shared
cp -r $QPEDIR/mkspecs/qws/linux-arm-g++ $QPEDIR/mkspecs/qws/linux-myarm-g++
Qt/Embedded
编辑$QTEDIR/configs/linux-myarm-g++-shared, 修改其中的utilities和flags成适合系统的内容, 如:
可能需要修改SYSCONF_CXX, SYSCONF_CC 和SYSCONF_LINK, 指定正确的编译器. 可能需要增加编译选项-DMYARM,在代码中增加宏#ifdef MYARM(用以增加设备相关的代码)
tmake
编辑$TMAKEDIR/lib/qws/linux-myarm-g++/tmake.conf,修改用到的utilites和flags:
可能需要修改TMAKE_CC, TMAKE_CXX 和TMAKE_LINK
可能需要增加-DMYARM选项
qmake

修改$QPEDIR/mkspecs/qws/linux-myarm-g++/qmake.conf:

QMAKE_CC, QMAKE_CXX 和QMAKE_LINK
-DMYARM
注意:qmake.conf的最后一行必须是:
exists($$(QPEDIR)/src/config.pri):include($$(QPEDIR)/src/config.pri)

可用于目录名的字符

正则表达式字符

Qtopia 1.9.x和Qtopia 2.0.0 – 2.1.0对字符有以下的要求:

Qtopia build系统访问到的任何目录都不能包含正则表达式字符
任何能被QRegExp识别的特殊字符和字符序列都可能引起问题
‘.’字符只匹配自身
不要将正则表达式字符用于目录名,包括(但不仅限于): + . ? * \ () [] ^ $ {}
注:Qtopia 2.1.0和2.1.1及以上版本可以通过应用patch解除以上的限制

空格

Qtopia build系统不支持目录名中包含空格。

必须保证:

build系统访问到的目录不包含空格
访问目录的各层上级目录也不包含空格

Qtopia的依赖和必要条件
——————————————————————————–
简介
为了使Qtopia正确运行, 必须满足以下的必要条件:
安装适当的编译/交叉编译工具
Qt/Embedded-2.3.11
Linux kernel提供共享内存、mmap和socket支持
Linux支持frame buffer
Linux支持OSS声音或支持与OSS兼容的ALSA声音。 进一步的信息参考 The Qtopia A/V & Appearance FAQ
还需要以下的库:

Video4Linux
zlib
libuuid(aka luuid)
libjpeg
xorg 或X11
注:Freetype不是必须的但建议支持 http://freetype.sourceforge.net/index2.html

支持的编译器和交叉编译器
gcc-2.95.2
gcc 3.2.4
gcc-3.3.0, gcc-3.3.3, gcc-3.3.4
gcc-3.4.1

声音

Qtopia需要/dev/dsp可写,并支持以下的ioctl操作:

SNDCTL_DSP_SETFRAGMENT – Qtopia将这个值设置为0x4000c.
SNDCTL_DSP_SETFM – Qtopia设置为AFMT_S16_LE
SNDCTL_DSP_STEREO – Qtopia 设置为 1/true.
SNDCTL_DSP_SPEED – Qtopia设置为44100.
SNDCTL_DSP_GETOSPACE
Qtopia 还需要/dev/dsp可以以阻塞方式和非阻塞方式打开。以上的设定是Qtopia需要的设定,但可以容许少许的偏差,但如果不设定成Qtopia需要的值则不能保证音频能平滑播放。假如您的设备只支持22500的播放速率,则在调用SNDCTL_DSP_SPEED时要报告此速率,以免造成音频质量的缺损。不过,如果系统不支持GETOSPACE,非阻塞写入或 SNDCTL_DSP_SET_FRAGMENT, 几乎可以肯定必然会损失音频质量。

Video4Linux

Camera应用程序需要支持Video4Linux v1的内核, Qtopia没有提供该支持。

请参考官方的 Video for Linux 资源站点,参看API的详细内容。

zlib

zlib可以从 http://www.gzip.org/zlib/ 下载

libuuid(aka luuid)

Qtopia不提供uuid支持。 这个库可以从 http://e2fsprogs.sourceforge.net/ 站点下载

另外, 如果你有SuSE Linux的发行版, e2fsprogs-devel这个包可以提供uuid支持; 在Debian中对应的包是uuid-dev. 这个库应该放在标准路经下/usr/lib/libuuid.so

请用包管理工具来查看该包是否已经安装:

rpm -qa | grep e2fsprogs

如果尚未安装,请从安装盘或镜像站安装这个包。

需要注意的是,如果没有安装e2fsprogs-devel,在链接时会发生下面的错误:

/usr/lib/gcc-lib/i586-suse-Linux/3.3.3/../../../../i586-suse-linux/bin/ld:
cannot find -luuid
如果安装了该库仍遇到上述错误,则检查Qtopia的configure脚本的-L和-R参数, 以确定脚本包含了库的实际路径。 关于交叉编译的信息可参考 System Integrator’s Guide.

libjpeg

Qtopia不提供jpeg库。 Qtopia需要Qt/Embedded配置为支持jpeg。

libjpeg库可从 http://www.ijg.org/ 下载

此外,如果你有SuSE发行版, libjpeg这个包可提供该库。 这个库应该安装在标准路经/usr/lib/libjpeg.so

检查libjpeg包是否已经安装:

rpm -qa | grep libjpeg

如果未安装,请从安装盘或镜像站安装。

关于libjpeg交叉编译的信息, 可参考System Integrator’s Guide.

xorg或X11

开发包括有从以下站点下载:

http://www.xfree86.org/
http://xorg.freedesktop.org
相关讨论

决定开始Qtopia需要的步骤, 参考: Getting started

将Qtopia集成到特定设备上的重点步骤, 参考: System Integrator’s guide

Qtopia的FAQs,参看: Qtopia index page

系统是完全安装RedHat9.0(里面带QT3.1),板子是X-Hyper250B的,Toolchain用的是开发板带的hybus-arm-linux-R1.1

交叉编译所用到的文件:
qt-embedded-2.3.10-free.tar.gz
qt-x11-2.3.2.tar.gz
qtopia-free-source-2.1.1.tar.gz
tmake-1.13.tar.gz
e2fsprogs-1.35.tar.gz

主机x86的编译步骤:
tar xfz qt-embedded-2.3.10-free.tar.gz(解压后qt-2.3.10改名为qt-2.3.10-host)
export QTEDIR=$PWD/qt-2.3.10-host
tar xfz qt-x11-2.3.2.tar.gz(解压后qt-2.3.2)
export QT2DIR=$PWD/qt-2.3.2
tar xfz qtopia-free-source-2.1.1.tar.gz(解压后qtopia-free-2.1.1改名为qtopia-2.1.1-host)
export QPEDIR=$PWD/qtopia-2.1.1-host
tar xfz tmake-1.13.tar.gz(解压后tmake-1.13)
export TMAKEDIR=$PWD/tmake-1.13
export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH

cd qt-2.3.2
export QTDIR=$QT2DIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-xft
make
make -C tools/qvfb
cd ..

cd qt-2.3.10-host
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
mkdir bin (因为解压后的qt-2.3.10没有bin文件夹)
cp $QT2DIR/bin/uic bin
cp $QT2DIR/tools/qvfb/qvfb bin
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
./configure -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32
make
cd ..

tar xzf e2fsprogs-1.35.tar.gz
cd e2fsprogs-1.35
./configure -enable-elf-shlibs
make install lib/uuid/
注:这是编译x86的libuuid库
cd ..

cd qtopia-2.1.1-host
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
./configure
make

编译例子:
$qmake -project ==>>我都是这样创建.pro文件的
$tmake -o Makefile hello.pro
$make
$qvfb &
$./hello -qws 或者$qpe
还没怎么仔细研究过。

目标机arm-linux的编译步骤:
tar xfz qt-embedded-2.3.10-free.tar.gz(解压后qt-2.3.10改名为qt-2.3.10-target)
export QTEDIR=$PWD/qt-2.3.10-target
tar xfz qt-x11-2.3.2.tar.gz
export QT2DIR=$PWD/qt-2.3.2
tar xfz qtopia-free-source-2.1.1.tar.gz(解压后qtopia-free-2.1.1改名为qtopia-2.1.1-target)
export QPEDIR=$PWD/qtopia-2.1.1-target
tar xfz tmake-1.13.tar.gz
export TMAKEDIR=$PWD/tmake-1.13
export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-arm-g++
export PATH=$TMAKEDIR/bin:$PATH

cd qt-2.3.2
export QTDIR=$QT2DIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-xft
make
make -C tools/qvfb
cd ..

cd qt-2.3.10-target
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
mkdir bin
cp $QT2DIR/bin/uic bin
cp $QT2DIR/tools/qvfb/qvfb bin
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
./configure -xplatform linux-arm-g++ -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32
make
cd ..
注:这里需要arm版本的libjpeg.so.62,hybus-arm-linux-R1.1里面包含这个库;如没有可以上网下载。

tar xzf e2fsprogs-1.35.tar.gz
cd e2fsprogs-1.35
./configure -host=arm-linux -with-cc=arm-linux-gcc -with-linker=arm-linux-ld -enable-elf-shlibs -prefix=/usr/local/hybus-arm-linux-R1.1/arm-linux
make install lib/uuid/ ===>>>这步安装到hybus-arm-linux-R1.1/lib上的libuuid.so.1.2版本不对,
要cp lib/libuuid.so.1.2 ../hybus-arm-linux-R1.1/lib
注:这步是交叉编译arm的libuuid库,配置详情见./configure –help
(还要多谢 http://panjet.wleda.com/?p=20 这里面的大哥呀,好不容易才在网上找到的)
cd ..

cd qtopia-2.1.1-host
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
cp src/libraries/qtopia/custom-linux-ipaq-g++.cpp src/libraries/qtopia/custom-linux-arm-g++.cpp
cp src/libraries/qtopia/custom-linux-ipaq-g++.h src/libraries/qtopia/custom-linux-arm-g++.h
./configure -xplatform linux-arm-g++
make
注:这里需要libstdc++.so和libgcc_s.so库

develop环境下qt中文化程序设计
——————————————————————————–
原文出处:Linux公社

kdevelop是一款在linux平台下可以同windows环境下的vc相媲美的集成开发环境,qt则是一款支持包括windows和linux平台
的GUI库,可以说它是linux下的MFC.在显示上,qt使用Unicode作为内部编码,可以支持多种编码.如何使用qt进行国际化编程
在网上可以找到很多资料的,但都是针对较早版本的qt进行介绍的.qt3.0.5中对这些作了些改动,这些方法就相应的要做些改动.
而且在kdevelop中开发qt应用程序,将会事半功倍.我的开发环境为redhat8.0(需安装kde开发工具包).
首先在linux中打开kdevelop集成开发环境,用它的应用程序向导新建一个qt的SDI的应用程序框架.这个同windows下vc很类似.它
将会为你自动生成版本号,作者,e-mail等信息的单文档对话框的应用程序框架.我们首先对它自动生成的程序进行汉化(qt1是
我的项目名称).

1.汉化自动生成的程序

添加翻译文件
在”项目”菜单中选择”添加新的翻译文件”,语言选择”zh_CN.Gb2312″.将会创建一个zh_CN.GB2312字符编码的翻译文件.扩展名
为”.ts”.在qt3.0.5环境下,打开”*.ts”翻译文件的工具是linguist.你可以在”工具”菜单中选择”QT
linguist”来打开,在linguist菜单中选择”file”->”open”打开所要翻译的翻译文件.此时可以在linguist窗口中的source text中
的文本就是你所要翻译的文本,选择所要翻译的文本,在下方有一个类似一页纸一样的地方,在translate下输入翻译后的文本.所示.
翻译完这些文件后,编译运行,在我们的程序里并不能显示中文,还是英文,我们还需要做的就是用lrelease命令将翻译后的文件转换成”.qm”文件才可以使用.在控制台下进入你用kdevelop所生成的应用程序目录.
>lrelease Makefile.am
qt3.0.5用这个两个程序取代了以前版本的findtr和msg2qm命令.在kdevelop集成环境中打开main.cpp主函数,
……
QApplication a(argc, argv);
a.setFont(QFont(“helvetica”, 10));
QTranslator tor( 0 );
tor.load( QString(“qt1.”) + QTextCodec::locale(), “.” );
// tor.load( QString(“qt1.zh_CN.GB2312”), “.” );
a.installTranslator( &tor );
/* uncomment the following line, if you want a Windows 95
look*/
// a.setStyle(WindowsStyle);

Qt1App *qt1=new Qt1App();
//Form1 *qt1=new Form1();
a.setMainWidget(qt1);
……
此处:
tor.load( QString(“qt1.”) + QTextCodec::locale(), “.” );
是根据客户环境的locale来载入当前目录下相应的翻译文件的.redhat中文环境默认的locale为gb18030,
此处要么把翻译文件名由qt1.zh_CN.GB2312.qm改为qt1.zh_CN.GB18030.qm,要么将这句改为
tor.load( QString(“qt1.zh_CN.GB2312”), “.” );
不过为了国际化编程的需要,建议采用第一种方法.更改后编译运行,你会发现你的程序已经是中文界面的了.

2.汉化自己的对话框

大多数情况下我们都需要自己来设计对话框,qt为我们提供了非常好的对话框编辑器QtDesigner,可以很方便的设计我们的对话框,qt
的信号和槽等,关于QtDesigner的使用,限于篇幅,不再赘述.以前面的程序为基础.在kdevelop中选择”文件”->”新建”,选择Qt
Designer文件(*.ui).在文件名一栏中填写”mydialog”,最后点击确定按钮,即会启动QtDesigner,此处只拖了一个Label,写了一
些英文字符.对话框的name属性为Form1.将对话框mydialog.ui保存.
在控制台下进入你用kdevelop所生成的应用程序目录.
>lupdate Makefile.am
同样用”QT
linguist”来翻译qt1.zh_CN.GB2312.tr文件.此时linguist的context中会多出Form1的选项,这里面就是我们新建的对话框要翻译的
选项.依据前面的方法进行汉化.
>lrelease Makefile.am
生成qt1.zh_CN.GB2312.qm文件.
编译将会生成mydialog.cpp mydialog.h mydialog.moc文件.然后将main.cpp中的
Qt1App *qt1=new Qt1App();改为
Form1 *qt1=new Form1();
并将”mydialog.h” #include
进去.依据前面的方法更改tor.load中加载的翻译文件.编译运行,你的对话框也是中文的了.

3.其它的一些说明

由于qt返回的是Unicode编码,譬如你在LineEdit中直接输入中文,返回的就是??,qt中可以直接使用QTextCodec来转换字符串的编码.
QString string;
string=LineEdit1->text(); //取得LineEdit1返回的文字
QTextCodec *codec=QTextCodec::codecForName(“GBK”);
//转换编码
QCString
chinese_string=codec->fromUnicode(string);//用QCString来存储返回的多字节编码
当然,你在头文件中就必需加入
#include <qtextcodec.h>
#include <qstring.h>
#include <qcstring.h>

4.QTextStream对中文的支持

QTextCodec* codec = QTextCodec::codecForName(“GBK”); /* 当前编码为”GBK” */
QTextStream mystream(&file);
mystream.setCodec(codec);

5. QCString&QString
QCString中不以unicode编码
QString以unicode为编码.
qt内部使用unicode为编码,所以如果要在qt的部件如multilineedit中显示中文,则需要将非unicode的字符转换成unicode字符.
QCString locallyEncoded = “中国人不是东亚病夫”; // text to convert
QTextCodec *codec = QTextCodec::codecForName(“GBK”); // get the codec for GBK
QString unicodeString = codec->toUnicode( locallyEncoded );

http://www-128.ibm.com/developerworks/cn/l…oolkit/qt/i18n/

Qt 国际化编程
——————————————————————————–
内容:

1. Qt 的文本显示

2. Qt 的文本输入

3. Qt 的打印

于明俭

2002 年 1 月 09 日

本篇讨论 Qt 库对国际化的支持,将介绍 Qt 对文本显示,输入和打印的支持,和如何 使用Qt 开发国际化的软件。
Qt 目前的版本(2.2.4)对国际化的支持已经相当完善。 在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编码。 为 Qt 增加一种编码的支持也比较方便,只要 增加该编码和Unicode的转换编码便可以了。 Qt 目前支持ISO标准编码ISO 8859-1, ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和 ISO 8859-15(对于阿拉伯语和希伯来语的支持正在开发之中),中文GBK/Big5,日文 eucJP/JIS/ShiftJIS,韩文eucKR,俄文KOI8-R。 当然也可以直接使用UTF8编码。

Qt 使用了自己定义的Locale机制,在编码支持和信息文件(Message File)的翻译上弥补了目前Unix上所普遍采用Locale和gettext的不足之处。 Qt 的这种机制可以使 Qt 的同一组件(QWidget)上同时显示不同编码的文本。 比如,Qt 的标签上可以同时使用中文简体 和中文繁体文本。

在文本输入上,Qt 采用了XIM(X Input Method)标准协议,可以直接使用XIM输入服务器。由于目前的绝大多数输入服务器都是针对单一语言的,所以在 Qt 的标准输入组件( QLineEdit,QMultiLineEdit)中的输入受到单一编码的限制,Qt 还不支持动态切换编码输入的支持,这是它的不足之处。

1. Qt 的文本显示
——————————————————————————–
像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数 QObject::tr(),它 用于从Qt的信息文件 .qm 中取出信息,这些信息是经过 Qt 的工具处理的。 Qt在处理 编码时还使用了 QTranslator 类,可用于指定整个应用软件的 的信息文件。

使用 Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。 比如要 编写一中文界面的 Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取 出来翻译。 这样,程序还可以根据Locale的不同,支持多种语言。 下面介绍如何在 Qt 程序中标注字符串,如何提取并翻译文本。
下面是一段使用了 QObject::tr()的代码,它建立了一个弹出菜单,菜单项是”Quit”, 它被放置在菜单条上,在菜单条上显示的是标签”File”。

QPopupMenu* popup;
popup = new QPopupMenu( this );
popup->insertItem( tr(“&Quit”),qApp,SLOT(quit()) );
menubar->insertItem( tr(“&File”),popup );

对于绝大多数情况,可以用上述方法处理。不过有时在定义某些变量中使用的字符串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用某种方法标志出 来。Qt 定义了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。前者用于单个字符串,后者用于多个字符串。比如,

static const char* strings[] = {
QT_TR_NOOP( “Hello” ),
QT_TR_NOOP( “World” )
};

有时需要使用printf/sprintf之类的函数动态生成字符串,比如,

QStings s;
s.sprintf( “Button %d”,i );
but->setText( s );

对这种使用方式的国际化是使用 arg() 函数。

QString s = tr( “Button %1” ).arg(i);
but->setText( s );

提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:

findtr [filename].cpp > i18n.po

它类似于GNU的 xgettext,上述文件的提取信息文件内包含,

….
“Content-Type: text/plain; charset=iso-8859-1\n”

#: i18n.cpp:34
msgid “ExampleWidget::&File”
msgstr “”

接下来是文本翻译过程。 在Qt中翻译信息文件时应该注意以下事项: (1) 提取的信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该 注意改动它的字符集,比如对中文GB2312和Big5编码,应该是, “Content-Type: text/plain; charset=gb2312\n”或者”Content-Type: text/plain; charset=big5\n”。 (2) 提取的信息有一个范围,比如上面的文件指定的范围是 ExampleWidget, 在翻译 前应该把它去掉,变成 msgid “::&File”。(3) 被翻译的字符串可能含有加速键符号,如 “&File”中的”F”,如果翻译成中文最好保留该信息,它可以翻译成 “文件(&F)”。

对于翻译后的文件(比如上面的翻译文件存为 i18n_gb.po),必须使用 Qt 提供的 工具 msg2qm 把它转换为 .qm 文件才能使用,

> msg2qm i18n_gb.po i18n_gb.qm

它类似于GNU的 msgfmt 命令。翻译后的文件可以用Qt程序直接调用。

QTranslator *translator = new QTranslator(0);
translator->load(“i18n_gb.qm”,”.”);
qApp->installTranslator(translator);

此外,Qt 还提供了类似于 msgmerge 的工具 mergetr,它用于把新提取的信息 文件和已经翻译过的信息文件融合起来,在此不再赘述。

在 Qt 中也可以直接使用 QTextCodec 来转换字符串的编码,这为在Qt下开发纯 中文软件带来了便利条件,不过这种方法不符和国际化/本地化的习惯,

char *string = “中文和English混和字符串!”
QTextCodec* gbk_codec = QTextCodec::codecByName(“GBK”);
QString gbk_string = codec->toUnicode(string);
QLabel *label = new QLabel(gbk_string);

如果使程序只支持一种编码,也可以直接把整个应用程序的编码设置为GBK编码, 然后在字符串之前 加tr(QObject::tr),

qApp->setDefaultCodec( QTextCodec::codecForName(“GBK”) );
QLabel *label = new QLabel( tr(“中文标签”) );

如果使Qt根据Locale的环境变量取得字符集,可以使用 QString::fromLocal8Bit(str)。

本节的例子请参见 qt-i18n-example.tar.gz

2. Qt 的文本输入
——————————————————————————–
在输入方面,Qt 的输入条(QLineEdit)和编辑区(QMultiLineEdit)都支持 XIM,只要配合相应的输入服务器,便可以输入中文/日文/韩文。目前有许多支持XIM的软件,比如 中文: Chinput/xcin/rfinput/q9,日文: kinput2/skkinput,韩文: ami/hanIM。

Qt程序的缺省输入风格是OverTheSpot风格,它也支持 OffTheSpot风格和 Root风格。 用户可以在起动程序时在命令行指定输入风格,比如对程序app,

./app -inputstyle overthespot #缺省风格,光标跟随
./app -inputstyle offthespot
./app -inputstyle root

经过 MiziLinux 补丁的Qt-2.2.0 支持 OnTheSpot 输入风格,并且把它作为 缺省的输 入风格。请参见 http://www.mizi.com/ko/kde/doc/onthespot/onthespot.html。

Qt 中的任何一个 Widget 都可以接受输入,只要它可以有键盘聚焦(Keyboard Focus)。所以对特殊 Widget 的输入处理只需要截获键盘输入,获取从XIM服务器 来的字符串。 对于OverTheSport风格的支持,刷新XIM输入服务器的位置即可。

3. Qt 的打印
——————————————————————————–
在打印方面,XWindow下的 Qt 生成PostScript并使用lpr打印。 它含有QPrinter类, 可以方便地支持输出页面的控制。 对于中文打印,必须修正PostScript文件的输出 部分。

TOpia中文化
——————————————————————————–
一:字符集介绍

我国已经颁布了多种中文信息编码标准,常用的有:GB2312-1980、GB12345、GB13000(GBK)以及最新标准GB18030,其中 GB13000是对GB2312的扩展,又常被成为GBK,GB18030向下兼容GB2312和GBK,中文WINDOW98、中文WIN2000操作系统采用的中文字符集是GB2312。

GB2312字库仅覆盖双字节部分,存储位置索引是编码中每字节的第8bit置0得来的,如A1A1编码汉字在字库中的索引是2121,而非A1A1。以下是它的编码规则:

单字节:00~7F

双字节:A1~F7 A1~FE

GBK的编码规则是:

单字节:00~7F

双字节:81~FE 40~7E

80~FE

GB18030是最新的汉字编码标准,其编码为一、二、四变长编码:

单字节:00~7F

双字节:81~FE 40~7E

80~FE

四字节:81~FE 30~39 81~FE 30~39

Unicode编码采用等长编码,二个字节表示一个字符编码,对于ASCII码也采用双字节来表示,unicode使用二维空间来描述编码空间,平面分为256行、256列,对应于编码的高低字节。

二:Qt 国际化编程

在文本显示上,Qt 使用了Unicode 作为内部编码,为了程序的国际化,通常我们在文本显示的地方不直接输入本地字符,用英文代替,比如要编写一中文界面的 Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。对于需要翻译的地方,首先是在该文本处用tr()函数标识,同时制作出.qm信息文件,并在程序中加入QTranslator即可。比如我们在某一程序中有如下语句:

setCaption(tr(“main window”));

为了能显示中文,有两种方法:

方法一:
——————————————————————————–
修改工程文件,加上TRANSLATIONS = xxx.ts

lupdate 工程文件名

用linguist编辑刚生成的xxx.ts文件并保存

lrelease 工程文件名 xxx.qm

在main.cpp中加入QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

qApp->setFont(font1);

QTranslator *translator = new QTranslator(0);
translator->load(“xxx.qm”,”.”);
qApp->installTranslator(translator);

方法二:
——————————————————————————–
findtr 文件名(通常为CPP文件) > xxx.po

编辑po文件,其中charset需由iso-8859-1改为GB2312,然后将“main window”翻译成“主窗口”

msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm

在main.cpp中加入QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

qApp->setFont(font1);

QTranslator *translator = new QTranslator(0);
translator->load(“xxx.qm”,”.”);
qApp->installTranslator(translator);

方法三:
——————————————————————————–
有时我们只是提供给本地用户使用,无需国际化,QT提供这一支持,在QT中有许多本地字符集同unicode的转换引擎,他们皆为QTextCodec的派生类,如QGbkCodec、QJisCodec, QHebrewCodec等。如:

QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

qApp->setFont(font1);

QString caption=“主窗口“;

QTextCodec *gk_codec=QTextCodec::codecForName(“GBK”);

setCaption(gk_codec->toUnicode(caption));

从上面可以看出,使用转换引擎可以轻松实现中文显示,简要步骤如下:

1:修改main.cpp文件,将字体改为unifont

QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

qApp->setFont(font1);

2:在想汉化的内的头文件中加入QTextCodec指针变量和转换函数QString mytr(char *)

#include <qtextcodec.h>

QTextCodec* gbk;

QString mytr(const char *);

3:在想汉化的类的实现文件中,修改类构造函数,加入:

gbk=QTextCodec::codecForName(“GBK”);

4:在想汉化的类的实现文件中,添加mytr函数代码

QString Form1::mytr(const char* chars)

{

return gbk->toUnicode(chars,strlen(chars));

}

5:在想汉化的类的实现文件中,用“mytr”替换“tr”

2004-12-2 测试了上面的方法三,编译通过,如果将codec成员变量改成QTextCodec派生类变量,编译将通不过,比如将QTextCodec* gbk;改成QGbkCodec* gbk;编译将报告此处有语法错误。下面是相似的用法:

1:修改***.cpp文件,在顶部加入codec头文件

#include <qgbkcodec.h>

2:在***.h文件中,加入mytr()函数声明

QString mytr(char* buffer,int size);

3:在***.cpp文件中,加入mytr()定义

QString mytr(char* buffer,int size)

{

QGbkCodec* gbk=QTextCodec::codeForName(“GBK”);

return gbk->toUnicode(buffer,size);

}

4:在需要显示中文的地方,使用mytr函数即可

5:修改main.cpp文件,将字体改为unifont

QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

qApp->setFont(font1);

备注:在翻译或转换之前必须将Unicode字体调入,否则显示不出中文,网上相关文章并未提及这一点,如果不显式装载该字体,系统默认的是Latin1,于是汉字显不出来。

备注2:在编译qt/embedded之前,必须修改qconfig-qpe.h配置文件的内容,将与TextCodec相关的宏定义给去掉,否则QTextCodec::codecForName(“GBK”)将返回NULL指针。

备注3:使用findtr命令时可同时查找多个文件的tr(),并将查找结果都放入一个文件内,源文件以空格隔开即可,另外,生成的.po和.qm文件的文件名最好与工程文件名相同!

备注4:如果要显示繁体中文,则需要使用QTextCodec::codecForName(“big5”)。获取本地的使用语言,用 QTextCodec::locale(),它返回Qstring变量,通常如果是中文本地的话,通常其值为zh_CN.GB2312和 zh_TW.Big5,根据这个返回字符串,可以加载相应的codec。如果程序只支持一种编码,也可以直接把整个应用程序的编码设置为一个默认的编码标准,比如系统只需要显示中文和英文,则可以直接设置应用程序的默认编码标准是GBK,如下使用方法:

qApp->setDefaultCodec( QTextCodec::codecForName(“GBK”) );

QLabel *label = new QLabel( tr(“中文标签”) );

备注5:如果使用本地的字符转换器,可以使用Qstring的静态函数Qstring::fromLocal8Bit(char* buffer,int size),将本地字符串转换成UNICODE字符串,不过要设置好LANGUAGE环境变量。

三:QTOpia中文化
——————————————————————————–
findtr 文件名 > xxx.po

编辑xxx.po文件

msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm

拷贝可执行文件到QPEDIR/bin目录

拷贝xxx.po和xxx.qm文件到QPEDIR/i18n/zh_CN目录

进入QPEDIR/apps/Applications目录创建一新.desktop文件

iconv –f utf8 –t GB18030 xxx.desktop > xxx1.desktop

编辑xxx1.desktop文件,主要是修改Exec、Icon、Name和Name[zh_CN]四项

iconv –f GB18030 –t utf8 xxx1.desktop > xxx.desktop

rm –f xxx1.desktop

qvfb –depth 16 &

cd $QPEDIR/bin

./qpe

备注:如果你的系统中有多个qtopia版本,要特别注意QTDIR、QPEDIR、LD_LIBRARY_PATH环境变量

备注2:可按照此方法汉化qtopia自带的应用程序

备注3:po文件是中间文件,程序真正需要的是qm文件。iconv是系统自带的内码转换工具,它能将utf8编码的文件转换成gb18030编码的文件,反之也能,转换这一步必不可少,因为desktop文件缺省是utf8编码的,而我们的redhat linux 7。3中文操作系统用的却是gb18030,所以在编辑器打开前需转换。

四:汉化qtopia-1.5.0 for Arm
——————————————————————————–
首先按照“三”的方法对要汉化的程序提取*.qm文件和*.desktop桌面配置文件,在做完这一步后,将*.qm文件down到目标机的 /opt/qtopia-free-1.5.0.arm/i18n/zh_CN目录下,同时将*.desktop文件覆盖/opt/qtopia- free-1.5.0.arm/apps目录下的相应文件,目标机的环境变量配置如下:

export QTDIR=/opt/qt-2.3.3.arm

export QPEDIR=/opt/qtopia-free-1.5.0.arm

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export PATH=$QPEDIR/bin:$PATH

export LANG=zh_CN

开机启动,由于设置的语言为简体中文,qpe会自动为每个应用加载Unifont字体,以及简体中文目录下的翻译文件,因而显示出中文,翻译文件是一个方面,但更关键的是要显示中文必须有中文字体来支持,Unifont字体包含中文字,因而能显示中文,没有相应字体的支持,光有翻译文件是显示不出中文的!

在经过以上的步骤后,有的应用在显示上依然会显示方框,这多半是由于该窗体相关的字体可能不是支持中文的字体,这需要直接修改源代码,以下是在汉化qtopia-free-1.5.0.arm的过程中的相关记录:

1. 在编译qtopia的过程中,可能会报告找不到SetButtonGroupID()函数,编译通不过。这是由于库中并没有该函数,一般情况下将该语句隐藏掉,原代码的原意是设置Button按钮在ButtonGroup组的序号,隐藏该语句对应用无影响。出现这个问题,主要在 /netsetup/dialup/dialupbase.cpp文件和/taskbar/shutdown.cpp文件,shutdown.cpp文件的相应行号是:96、149、201、253行。

2. 修改mpegplayer/playlistwidget.cpp文件的143行和166行,将字体设置改为Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉该语句

3. 修改snake/interface.cpp的87行和186行,将字体设置改为Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉该语句

4. 修改qasteroids/view.cpp的104行和qasteroids/toplevel.cpp的109行和165行,将字体设置改为 Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉该语句

5. 修改sysinfo/versioninfo.cpp文件,将61行的builder改为作者本人,将50行的v改为tr(“corpname”),重新建立po文件,并翻译corpname为 您希望的名字,使用msg2qm生成qm文件

6. 修改桌面,位于taskbar目录下,生成libqpe.po和libqpe.qm文件,并将libqpe.qm文件拷贝到i18n/zh_CN目录下

五:qtopia目录结构
——————————————————————————–
apps/Applications:应用程序桌面配置文件

apps/Games:游戏桌面配置文件

apps/Settings:系统设置桌面配置文件

bin:二进制可执行文件

configs:编译配置文件目录

doc和docs:qtopia的参考文档

etc:应用配置文件目录

i18n:国际化目录

i18n/zh_CN:简体中文目录

include/qpe:与qtopia相关的头文件目录

inputmethods:输入法

library:qtopia部分源代码目录

pics:与应用相关的图片存放目录

plugins:各种插件目录,如mpeg3解码插件、输入法插件等

sounds:音频文件存放目录

taskbar:桌面程序的源代码(qpe的源代码)

QT资源

Posted by – December 10, 2009

http://lfs.linuxsir.org/htdocs/blfscvs/x/qt.html

STL 简介(标准模板库 简介)

Posted by – December 10, 2009

STL 简介,标准模板库 简介:
http://www.linuxsir.org/bbs/thread44097.html

UNIX/Linux程序设计资源

Posted by – December 10, 2009

UNIX/Linux程序设计资源
转载自: http://www.linuxsir.org/bbs/thread113101.html
—————————————————–

linux编程基础:
要入门先看这个,Linux下C语言编程基础知识
http://www.linuxsir.org/bbs/showthre…A1%D6%AA%CA%B6
Linux 下 C 语言编程
http://www.linuxsir.org/bbs/showthre…&threadid=7192
Linux下的C++编程
http://www.linuxsir.org/bbs/showthre…723#post276723

参考书籍
Linux程序员指南(The Linux Programmer’s Guide)
http://www.linuxhq.com/guides/LPG/lpg.html
UNIX编程环境(The UNIX Programming Environment)
http://www.iu.hio.no/~mark/unix/unix_toc.html
UNIX编程的艺术(The Art of Unix Programming)
http://www.catb.org/~esr/writings/taoup/html/

进程与线程
Linux下的多进程编程初步
http://www.china-pub.com/computers/emook/0439/info.htm
多进程编程
http://www.linuxsir.org/bbs/showthre…threadid=44083
Linux下的多进程编程
http://www.linuxsir.com/bbs/showthre…threadid=48887
进程的创建
http://www.linuxsir.org/bbs/showthre…threadid=44078
POSIX Threads Programming
http://www.llnl.gov/computing/tutori…eads/MAIN.html
YoLinux Tutorial: POSIX thread (pthread) libraries
http://www.yolinux.com/TUTORIALS/Lin…ixThreads.html

linux系统调用
系统调用列表,编程必备
http://www-900.ibm.com/developerWork…appendix.shtml
C语言库函数—unix常用系统调用—使用说明
http://www.linuxsir.org/bbs/showthre…hreadid=119136
http://chinaunix.net/forum/viewtopic.php?t=72159

FAQ列表
UNIX Programming FAQ 中文版,很有参考价值
http://www.linuxforum.net/books/upfaq/book1.htm
UNIX Socket FAQ
http://www.developerweb.net/sock-faq/

编码规范
Linux内核编程风格
http://www.linuxsir.org/bbs/showthre…&postid=257594
GNU编码标准
http://www.linuxforum.net/forum/show…p&Number=29053

可执行文件格式与库文件
从程序员角度看ELF
http://www.linuxsir.com/bbs/showthre…threadid=48381
ELF可执行联接规范(英汉对照版)
http://www.linuxaid.com.cn/articles/…14528121.shtml
Linux动态链接库高级应用
http://www.linuxsir.com/bbs/showthre…threadid=18889
链接器与加载器,非常重要的一本书(Linkers and Loaders )
http://www.iecc.com/linker/

终端与串口编程、设备文件
UNIX下c语言的图形编程–curses.h 函式库
http://www.fanqiang.com/a4/b2/20020626/060200258.html
VT100控制码
http://www.linuxsir.com/bbs/showthre…threadid=43530
Linux ioctl() Primer
http://www.linuxsir.org/bbs/showthre…threadid=44268
Linux Serial Programming How-to English version: http://www.sgmltools.org/HOWTO/Seria…-HOWTO/t1.html
Linux Serial Programming How-to 中文繁体版:http://www.linux.org.tw/CLDP/OLD/Ser…ing-HOWTO.html
Serial Programming Guide for POSIX Operating Systems
http://digilander.libero.it/robang/r…l.htm#CONTENTS

linux中文化:

UTF-8 and Unicode FAQ
http://www.linuxforum.net/books/UTF-8-Unicode.html
unicode 如何转换为ASCII?
http://www.linuxforum.net/forum/gsho…5&o=all&fpart=
一个台湾的linux中文化站点
http://xcin.linux.org.tw/i18n/
UTF-8 and Unicode FAQ for Unix/Linux
http://www.cl.cam.ac.uk/~mgk25/unicode.html
Linux Unicode 编程
http://www-900.ibm.com/developerWork…ni/index.shtml
Linux 国际化本地化和中文化
http://www.linuxforum.net/doc/i18n-new.html

一些很好的编程资源连接:

系统错误帮助
http://biology.ncsa.uiuc.edu/library…Help/sgi_html/
HPCVL编程资源连接
http://www.hpcvl.org/faqs/prog_links.html
Linux Programming Resources
http://leapster.org/linoleum/

一个综合的编程资源站点
http://www.clipx.net/norton.php