友善之臂的qtopia2.2.0加入多线程支持

本文章基于友善之臂提供的arm版本的qtopia2.2.0和x86版本的qtopia2.2.0,前提是系统中已经安装好交叉编译器。
要实现多线程,主要是要获得带多线程支持的动态链接库libqte-mt.so.2,libqte-mt.so.2需要通过编译qt获得,下面是编译libqte-mt.so.2的方法(arm和x86版本方法类似,一起叙述)。
1) 将友善之臂提供的qt源码解压,按照友善之臂手册利用build-all脚本完成一次编译。

arm版本解压后的路径为:/opt/ARM/arm-qtopia/

x86版本解压后的路径为:/opt/ARM/x86-qtopia/

2) arm 版本执行如下命令:
cd  /opt/ARM/arm-qtopia/qtopia-2.2.0-FriendlyARM
source  setQteEnv
cd  qt2
make  clean
echo yes | ./configure -embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -qt-zlib -qt-libpng -gif -no-g++-exceptions -no-qvfb -xplatform linux-arm-g++ -tslib –thread

x86版本执行如下命令:

cd  /opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM
source  setQteEnv
cd  qt2
make  clean
echo yes|./configure -embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -gif -thread
3) 上面的步骤执行后会在qt2目录下产生 src-mt.mk文件。

用编辑器将其内容的最后一行”cd src; $(MAKE) clean“删除或注释掉;

SHELL=/bin/sh

src-mt:
	cd src; $(MAKE) 	    'QT_THREAD_SUFFIX=-mt' 
'QT_LFLAGS_MT=$$(SYSCONF_LFLAGS_THREAD) $$(SYSCONF_LIBS_THREAD)' 
'QT_CXX_MT=$$(SYSCONF_CXXFLAGS_THREAD) -DQT_THREAD_SUPPORT' 
'QT_C_MT=$$(SYSCONF_CFLAGS_THREAD) -DQT_THREAD_SUPPORT'
	cd examples/guithreads; $(MAKE) 	    'QT_THREAD_SUFFIX=-mt' 
'QT_LFLAGS_MT=$$(SYSCONF_LFLAGS_THREAD) $$(SYSCONF_LIBS_THREAD)' 
'QT_CXX_MT=$$(SYSCONF_CXXFLAGS_THREAD) -DQT_THREAD_SUPPORT' 
'QT_C_MT=$$(SYSCONF_CFLAGS_THREAD) -DQT_THREAD_SUPPORT'
	cd examples/semaphores; $(MAKE) 	    'QT_THREAD_SUFFIX=-mt' 
'QT_LFLAGS_MT=$$(SYSCONF_LFLAGS_THREAD) $$(SYSCONF_LIBS_THREAD)' 
'QT_CXX_MT=$$(SYSCONF_CXXFLAGS_THREAD) -DQT_THREAD_SUPPORT' 
'QT_C_MT=$$(SYSCONF_CFLAGS_THREAD) -DQT_THREAD_SUPPORT'
	cd src; $(MAKE) clean
4)执行如下命令:
make  src-mt

5)如果在如上编译过程中提示 qtextcodec.cpp 编译错误,将 /opt/ARM/new-qtopia/arm-qtopia/qtopia-2.2.0-FriendlyARM/qt2/src/tools/qtextcodec.cpp 改成下面的代码:( 2148-2180 行)
#define QT_NO_EUCJPCODEC
#ifndef QT_NO_EUCJPCODEC
(void)new QEucJpCodec;
#endif
#define QT_NO_SJISCODEC
#ifndef QT_NO_SJISCODEC
(void)new QSjisCodec;
#endif
#define QT_NO_JISCODEC
#ifndef QT_NO_JISCODEC
(void)new QJisCodec;
#endif
#define QT_NO_EUCKRCODEC
#ifndef QT_NO_EUCKRCODEC
(void)new QEucKrCodec;
#endif
#define QT_NO_GBKCODEC
#ifndef QT_NO_GBKCODEC
(void)new QGbkCodec;
#endif
#define QT_NO_BIG5CODEC
#ifndef QT_NO_BIG5CODEC
(void)new QBig5Codec;
#endif
#define QT_NO_RTLCODEC
#ifndef QT_NO_RTLCODEC
(void)new QArabicCodec;
(void)new QHebrewCodec;
#endif
#define QT_NO_TSCIICODEC
#ifndef QT_NO_TSCIICODEC
(void)new QTsciiCodec;
#endif

6)对于arm版本,在/opt/ARM/arm-qtopia/qtopia-2.2.0- FriendlyARM/qtopia/lib目录下生成所期待的libqte-mt.so.2.3.12文件,将libqte-mt.so.2.3.12 改为libqte-mt.so.2,放入开发板/lib文件夹下。
x86版本需要修改/etc/ld.so.conf如下,并执行ldconfig指令。如果不修改的话,在后面的程序执行过程中,会提示找不到libqte-mt.so.2动态链接库。

include ld.so.conf.d/*.conf
/opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/lib
/opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib

下面以一个例子来说明如何使用多线程编程。
创建如下文件:
example.pro   //项目文件
main.cpp      //main函数文件
example.cpp   //例子程序
example.h     //例子程序头文件
arm-build     //编译arm版本可执行文件的脚本
x86-build     //编译x86版本可执行文件的脚本
run           //在x86上运行程序的脚本
example.pro
CONFIG		+= qtopiaapp
CONFIG		-= buildQuicklaunch
CONFIG          += qt warn_on release thread
DESTDIR	         = $(PWD)

HEADERS	+= example.h
SOURCES	+= example.cpp
SOURCES	+= main.cpp
TARGET   = example
unix:LIBS += -lm -L/lib 

main.cpp

#include <qtopia/qpeapplication.h>
#include <stdio.h>
#include <qobject.h>
#include <stdlib.h>

#include "example.h"

int main(int argc,char *argv[])
{
	QPEApplication a(argc,argv);	
	
	ExampleThread myThread;
	myThread.start();

	return a.exec();	
}

example.cpp
#include "example.h"

ExampleThread::ExampleThread()
{

}
ExampleThread::~ExampleThread()
{

}
void ExampleThread::run()
{
	while(1)
	{
		printf("example\n");
		sleep(1);
	}
}
example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H

#include <qthread.h>
#include <qobject.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <signal.h>

class Q_EXPORT ExampleThread : public QObject,public QThread
{
Q_OBJECT

signals:
    void	ExampleSignal();
public:
	ExampleThread();
	~ExampleThread();
protected:
virtual void run();

};

#endif //EXAMPLE_H
arm-build
#!/bin/bash

source /opt/ARM/arm-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv 
qmake -spec /opt/ARM/arm-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/mkspecs/qws/linux-arm-g++ -o Makefile *.pro 

make clean
make
x86-build
#!/bin/bash

source /opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv 
qmake -o Makefile -spec /opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/mkspecs/qws/linux-generic-g++ *.pro 

make clean
make
run
#!/bin/sh

export ApplicationDir=$PWD
/opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/bin/qvfb -width 320 -height 240 -depth 16 &
#export CAMERA_DEVICE=/dev/video1
#qtopia-2.2.0-FrinedlyARM/qt2/bin/qvfb -width 640 -height 480 -depth 16 &
cd /opt/ARM/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/image
mkdir root 2>/dev/null || true
export HOME=$PWD/root
cd opt/Qtopia
export PATH=$PWD/bin:$PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBARAY_PATH
export QTDIR=$PWD
export QPEDIR=$PWD
export KDEDIR=$PWD/../kde

sleep 3
$ApplicationDir/example -qws

arm-build,x86-build,run三个脚本添加可执行权限,运行
./x86-build
./run
如果能够不停的输出example,则表示x86版本添加多线程支持成功

执行arm-build,编译成arm版本的程序,复制到开发板上执行,如果也能输出example,表示arm版本添加多线程支持成功
( 为使qt支持输出调试信息到串口,修改 /bin/qtopia 文件最后一行为 exec $QPEDIR/bin/qpe 1>/dev/ttySAC0  2>/dev/null)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qtopia和Qt Creator是两个不同的概念。Qtopia是Trolltech公司(现已被Digia收购)为采用嵌入式Linux操作系统的消费电子设备而开发的综合应用平台,包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。而Qt Creator是Qt的集成开发环境(IDE),用于开发Qt应用程序。Qt Creator提供了一套工具和功能,使开发者可以轻松地编写、调试和部署Qt应用程序。所以,Qtopia和Qt Creator可以说是在不同层面上为Qt开发提供支持的工具和框架。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QTQT/E,Qtopia,qt creator的联系与区别](https://blog.csdn.net/qq_23329691/article/details/79063908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [各种Qt的区别——QtQt/Embeded,Qtopia,Qt Designer,Qt Creator](https://blog.csdn.net/xingsongyu/article/details/88028027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值