- 论坛徽章:
- 0
|
还没有完全弄好,不过先贴上来一些嘿嘿
1
今天下午qt莫名奇妙的出错了。重新安装
./configure
make
make
install
默认安装在/usr/local/Trolltech/Qt-X11目录下。
装完以后才知道,原来不是qt出错了,是我自己忘记怎么编qt程序了,源程序要以.cpp结尾,我连.c都没加,难怪出错了。-
-#好菜
2
安装qtopia
for x86,出了好多错误。下面是如何修改出错的代码。
Mkdir
qtopia-x86
cd
qtopia-x86
tar
xzvf qtopia-opensource-src-4.3.2.tar.gz
mkdir
build
cd
build
../qtopia-opensource-src-4.3.2/configure
-debug -profile
make
make的过程中出现了许多错误。
qtopia-opensource-4.3.2/qtopiacore/qt/src/gui/qdrawhelper.cpp
from line about 5890-> 大概是5890行
//以下注释掉
/*
#ifdef
QT_QWS_DEPTH_24
template
static inline void
qt_memrotate90_template(const quint32 *src,
int srcWidth, int srcHeight, int srcStride,
quint24 *dest, int dstStride)
{
#if
QT_ROTATION_ALGORITHM ==
QT_ROTATION_CACHEDREAD
qt_memrotate90_cachedRead(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif
QT_ROTATION_ALGORITHM ==
QT_ROTATION_CACHEDWRITE
qt_memrotate90_cachedWrite(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
// packed algorithm not
implemented
qt_memrotate90_cachedRead(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
// packed algorithm not
implemented
qt_memrotate90_tiled_unpacked(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#endif
}
#endif
// QT_QWS_DEPTH_24
#ifdef QT_QWS_DEPTH_18
template
static inline void qt_memrotate90_template(const quint32 *src,
int srcWidth, int srcHeight, int srcStride,
quint18 *dest, int dstStride)
{
#if QT_ROTATION_ALGORITHM ==
QT_ROTATION_CACHEDREAD
qt_memrotate90_cachedRead(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif
QT_ROTATION_ALGORITHM ==
QT_ROTATION_CACHEDWRITE
qt_memrotate90_cachedWrite(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif
QT_ROTATION_ALGORITHM == QT_ROTATION_PACKING
//
packed algorithm not
implemented
qt_memrotate90_cachedRead(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#elif QT_ROTATION_ALGORITHM == QT_ROTATION_TILED
// packed algorithm not
implemented
qt_memrotate90_tiled_unpacked(src,
srcWidth,srcHeight, srcStride, dest, dstStride);
#endif
}
#endif
// QT_QWS_DEPTH_24
*/
//以上注释掉
and
lines about 5960->
#ifdef
QT_QWS_DEPTH_24
//QT_IMPL_MEMROTATE(quint32,
quint24)
//注释掉这行
#endif
#ifdef
QT_QWS_DEPTH_18
//QT_IMPL_MEMROTATE(quint32,
quint18)//[color="#0000ff"]注释掉这行
#endif
Another
away modificatin has to do is in
file:
[color="#800000"]/usr/include/c++/4.3.0/bits/locale_classes.tcc
from
line about 100:
template
bool
has_facet(const locale& __loc) throw()
{
const size_t __i =
_Facet::id._M_id();
const
locale::facet** __facets = __loc._M_impl->_M_facets;
return (__i _M_facets_size
//#ifdef
__GXX_RTTI
//
&& dynamic_cast(__facets[__i]));//[color="#0000ff"]注释掉这行[color="#0000ff"]
//#else
&&
static_cast(__facets[__i]));
[color="#0000ff"]//#endif
}
template
const _Facet&
use_facet(const locale&
__loc)
{
const size_t
__i = _Facet::id._M_id();
const
locale::facet** __facets = __loc._M_impl->_M_facets;
if (__i >= __loc._M_impl->_M_facets_size ||
!__facets[__i])
__throw_bad_cast();
//#ifdef
__GXX_RTTI
// return dynamic_cast(*__facets[__i]);//[color="#0000ff"]注释掉这行[color="#0000ff"]
//#else
return static_cast(*__facets[__i]);
[color="#0000ff"]//#endif
}
dynamiccasting does not work for reason or
another. I don't know why. Withthese two modifications, compiling
works and I can make programs inqtopia with Fedora Core 9. Maybe this
is not right way to solve theseproblems, but it works in my machine.
安装过程中可能还会遇到另外一个错误:
error: call to
'__open_missing_mode'
解决办法是打开文件:
/qtopia-openshour-4.3.2/src/libraries/qtopiabase/qmemoryfile_unix.cpp
将里面-这行换成+这行,代码不多自己找
[color="#0000ff"]添加#include
头文件
int f = ::open(tmpFile.toLatin1(),
O_WRONLY);
if (!f)
-
f =
::open(tmpFile.toLatin1(), O_CREAT | O_WRONLY);
+
f = ::open(tmpFile.toLatin1(), O_CREAT
| O_WRONLY, S_IRUSR | S_IWUSR );
if (f){
fstat(f, &st);
Make
install安装结束
在qtopia-x86目录下写一个脚本生命Build目录的环境变量,目标文件在image目录下。
测试:
qvfb
&
./qpe
-qws
一直处于锁定状态。
提示
SxeMonitor
could not open security log file: /var/log/sxe.log, it may not have
sufficent permissions or file does not exist. The SxeMonitor will
not respond to security breaches
可能是这个原因导致qpe程序不能继续运行下去。在var/log目录创建一个空的sex.log文件。
于是尝试着换到root权限下运行qvfb,但终端提示,qvfb只能在用户状态下使用,当我切换到user权限的时候,出错了。提示
Cannot
open keyboard pipe /tmp/.qtvfb_keyboard-0
这是因为我利用root运行过qvfb,产生了一个保护文件。
删除tmp目录下的.qtvfb_keyboard-0,qvfb_mouse_0文件。使用ls
-al命令查看tmp目录,直接打开文件夹看不见这个保护文件的。切换到user权限下运行,OK。
又可以运行qvfb了,但问题是一直听留在这个画面上,闹钟只出现一小会马上消失了。但其他bin目录下的程序都可以运行阿。为什么qpe不行?
[color="#0000ff"]有个这样的错误提示,google搜索不到,不知道什么意思。
T0
Synchronization cannot start QCopBridge on port 4245
3
qtopia for arm
[color="#000000"](1)修改源码部分
#
cd qtopia-opensource-4.3.2/src/libraries/qtopiabase/
#
cp custom-linux-generic-g++.h custom-linux-arm-g++.h
#
cp custom-linux-generic-g++.cpp custom-linux-arm-g++.cpp
[color="#000000"]这两个函数包含控制液晶屏亮度函数和一些优化qtopiacore的宏定义,用户可以自己设定。
[color="#000000"](2)直接支持触摸屏而不使用外部库
#gedit
qtopia-opensource-4.3.2/qtopiacore/qconfig-qpe.h
在最后添加宏定义
#define
QT_QWS_IPAQ
#define
QT_QWS_IPAQ_RAW
[color="#000000"](3)还是qconfig-qpe.h修改时区信息读取路径
#define
QTOPIA_ZONEINFO_PATH "/usr/qtopia/zoneinfo/"
[color="#000000"]QTOPIA_ZONEINFO_PATH即时区所在的路径,修改它是必要的。因为qtopia默认时区信息路径是/usr/share/zoneinfo中寻找时区文件。将其定义到文件系统的目录下。
[color="#000000"](4)还是qconfig-qpe.h
注释掉关于鼠标光标的宏定义,让程序运行时,触摸屏中央有光标出现。
//
Qtopia Core
/*
#ifndef QT_NO_QWS_CURSOR
# define
QT_NO_QWS_CURSOR
#endif
*/
/*
#ifndef QT_NO_QWS_MOUSE
# define QT_NO_QWS_MOUSE
#endif
#ifndef
QT_NO_QWS_MOUSE_AUTO
# define QT_NO_QWS_MOUSE_AUTO
#endif
*/
其它宏定义根据需要进行注释。
保存后将qconfig-qpe.h拷贝到global目录。
#
cp qtopiacore/qconfig-qpe.h
qtopiacore/qt/src/corelib/global/qconfig-qpe.h
[color="#0000ff"]注释掉其他文件里的QT_NO_QWS_CURSOR的定义
#
vi qtopiacore/qt/src/corelib/global/qfeatures.h
注释掉如下内容:
/*
#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))
#define QT_NO_QWS_CURSOR
#endif
*/
保存退出。
#
vi qtopiacore/qt/src/corelib/global/qglobal.h
注释掉以下内容:
//#
define QT_NO_QWS_CURSOR
[color="#000000"](5)修改编译器信息
gedit
/usr/local/arm/3.4.1/arm-linux/include/linux/videodev2.h
在
#define
V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
之后添加
#define
V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR..
*/
按同样的方法修改
arm-linux/sys_include/linux/videodev2.h
[color="#000000"](6)配置编译qtopia,不能在源码目录中编译,重新创建一个work_qtopia目录,并将congiure写成一个脚本,方便编译。创建脚本my_configure.sh,内容如下:
/home/tangcong/qt-software/qtopia-opensource-4.3.2/configure
-xplatform linux-arm-g++ -arch arm -image
/home/tangcong/working/share/usr/qtopia -prefix /usr/qtopia -no-qvfb
-launch-method quicklaunch -displaysize 320x240 -no-bluetooth
-no-drm -no-modem -extra-qtopiacore-config " -depths 16
-no-mouse-linuxtp -no-mouse-pc -no-mouse-bus -no-mouse-yopy
-no-mouse-vr41xx -qt-mouse-tslib
-I/home/tangcong/working/share/usr/tslib/include
-L/home/tangcong/working/share/usr/tslib/lib" -extra-qt-config
"-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg" 2>&1
| tee logfile
主要配置选项解说如下:
-xplatform
linux-arm-g++ -arch arm 目标平台为arm-linux,体系结构为arm。
-no-qvfb
目标平台已支持buffer,因而不使用虚拟帧缓冲。
-extra-qtopiacore-config
为Qtopia
core 配置选项。
-xplatform
qws/linux-arm-g++ -embedded arm 目标平台编译配置文件使用
[color="#0000ff"]qtopiacore/qt/mkspecs/qws/linux-arm-g++目录下的配置文件,嵌入式平台为arm。
-qconfig
qpe 使用配置文件qconfig-qpe.h,若使用qconfig-large.h配置文件,则使用-qconfig
large
选项。
-qt-sql-sqlite
数据库支持Sqlite。
-qt-kbd-usb
键盘支持usb协议。
-no-mouse-linuxtp
-qt-mouse-tslib -I/.../tslib/include -L/.../tslib/lib 触摸屏协议不支持
[color="#0000ff"]linuxtp,支持tslib,并在后面添加上刚才编译的tslib的头文件和库。
[color="#0000ff"]执行my_configure.sh脚本,make
makeinstall.
[color="#000000"]开发板上运行的时候没有出现锁定的状况,qtopia的界面可以出现,但是位置有点不大对,而且色彩没也好暗阿,没有qvfb里面显示的那么好看。呵呵~但触摸屏不能起作用,只能打印出坐标信息,但是不能响应事件。
[color="#000000"]修改触摸屏程序,偶然发现启动信息里有这样一句话
input:
device s3c2410 TouchScreen is statically allocated, will not register
Please
convert to input_allocate_device() or contact dtor_core@ameritech.net
[color="#000000"]估计就是这个原因!触摸屏没有向input层注册~。
[color="#000000"]查看s3c2410_ts.c
input.c tsdev.c源代码,这个错误是因为dynalloc标记没有置位。
[color="#000000"]发现在s3c2410_ts.c中的probe()函数中有个init_input_device()函数,可知是初始化的意思,但是在input.c中nit_input_device()并不存在,而是一个struct
input_dev *input_allocate_device(void)函数,
struct
input_dev *input_allocate_device(void)
{
struct
input_dev *dev;
dev
= kzalloc(sizeof(struct input_dev), GFP_KERNEL);
if
(dev) {
dev->dynalloc
= 1;
dev->cdev.class
= &input_class;
class_device_initialize(&dev->cdev);
mutex_init(&dev->mutex);
INIT_LIST_HEAD(&dev->h_list);
INIT_LIST_HEAD(&dev->node);
}
return
dev;
}
[color="#0000ff"]EXPORT_SYMBOL(input_allocate_device);
[color="#000000"]因此修改s3c2410_ts.c源码,在probe函数中添加
[color="#0000ff"]ts.dev=*(input_allocate_device());/*2009-6-30*/
[color="#000000"]一般[color="#000000"]input[color="#000000"]类型的驱动程序在调用[color="#000000"]input_register_device[color="#000000"]注册之前会[color="#000000"]input_allocate_device
[color="#000000"]做分配之类的初始化操作,
[color="#000000"]如果没有这一步,
[color="#000000"]就会出现打印上述错误信息。
[color="#0000ff"]修改完毕之后,重新make
zImage,[color="#000000"]启动信息提示
ts:
Compaq touchscreen protocol output
s3c2410
TouchScreen successfully loaded
input:
s3c2410 TouchScreen as /class/input/input0
TCP
bic registered
[color="#000000"]登录进去以后查看[color="#000000"]/.dev[color="#000000"]目录,[color="#000000"]event0[color="#000000"]也生成了
cat
/proc/bus/input/device输出
[root@~]#cat
/proc/bus/input/devices
I:
Bus=0013 Vendor=dead Product=beef Version=0101
N:
Name="s3c2410 TouchScreen"
P:
Phys=ts0
S:
Sysfs=/class/input/input0
H:
Handlers=mouse0 event0 ts0 evbug
B:
EV=b
B:
KEY=400 0 0 0 0 0 0 0 0 0 0
B:
ABS=1000003
[color="#000000"]搞定~接下去ts_calibrate也可以用拉,看来一切都是触摸屏驱动惹得祸,可以进行下一步测试tslib的工作了,原来我的tslib也移植好了,不过小光标好像有点问题,跟我的笔调不大一致。经过实验,又发现原来使我ts_calibrate校准的时候没弄好,认真校准好5点以后,在运行ts_test发现光标跟笔的步伐还是差不多的。
[color="#000000"]在实验一下qte的helloworld程序。
4
qte for x86
[color="#0000ff"]声明了环境变量,qmake
helloworld程序,在qvfb里面可以看见。
5
qte for arm
[color="#0000ff"]声明环境变量,将qmake生成的helloworld程序放到/usr/qtopia/bin目录下,./hello_没有qte
-qws,等待了数十秒以后看见了一个很小的helloworld界面,可以启动就不错拉,起码路径设置是没有问题的。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93598/showart_1983412.html |
|