当前位置:首页 » 编程软件 » cups23交叉编译

cups23交叉编译

发布时间: 2022-07-05 09:27:16

1. 如何安装arm-linux-gcc

这是readme文件
1.arm-gcc-4.4.1-20100409.tar.gz
交叉编译器,将其解压
tar zxvf arm-gcc-4.4.1-20100409.tar.gz
到当前目录
当前目录将出现usr/local/arm/4.4.1的目录,将其中的arm目录拷贝到
/usr/local/arm目录
在/etc/profile下增加
export PATH=$PATH:/usr/local/arm/4.4.1/bin
然后
source /etc/profile

这样交叉编译器安装成功

2.qtopia-core-opensource-src-4.2.2.tar.gz
qt交叉编译库

压缩
拷贝 qmake.conf 到 mkspecs/qws/linux-arm-g++目录
替换原有文件
./configure -embedded arm -DQT_QLOCALE_USES_FCVT \
-qt-mouse-pc -qt-freetype -no-cups -no-nis -no-iconv \
-no-qdbus -qt-libjpeg -qt-libpng -qt-gif -qt-zlib \
-no-rpath -no-qt3support -no-largefile -no-accessibility \
-no-stl -no-libmng -little-endian -prefix /opt/QtPalmtop

提示第一次输入yes 回车
第二次直接回车

sudo make; sudo make install
这样将qt交叉编译库安装到/opt/QtPalmtop下

增加/opt/QtPalmtop到nfs共享
开发板上将该共享目录mnt到/opt/QtPalmtop下

在开发板上修改/etc/profile,增加三行
export LD_LIBRARY_PATH=/opt/QtPalmtop/lib
export QWS_DISPLAY="LinuxFb:/dev/fb1"
export QWS_SIZE="800*480"

利用其交叉编译qt程序
/opt/QtPalmtop/bin/qmake -project
/opt/QtPalmtop/bin/qmake
make
将其qt程序目录通过nfs共享到开发板,在开发板上运行

在开发板/etc/init.d/rcS文件增加运行的程序:
mount pc机器相关目录
运行程序
cd /sdcard/project_stu && ./project_stu -qws -nomouse &
cd /sdcard && ./mplayer -x 540 -y 350 (某一个开发板上的视频文件名)

2. pos机出现cups:55是什么意思

史上最全POS机错误码、POS应答码、POS高危码大全! 交易返回POS终端时都有39 域,POS终端和终端操作员根据应答码采取相应的操作,可以把操作分为以下几类:
A : 交易成功
B : 交易失败,可重试
C : 交易失败,不需要重试
D : 交易失败, 终端操作员处理
E : 交易失败,系统故障,不需要重试
注 1:如 39 域的内容不能在下表中找到,就显示“交易失败”
注 2:如POS交易的批次号和网络中心批次号不一致时应答码会填 “77”,此时POS机应当提示操作员重新签到后再交易
【POS机错误代码、POS应答码大全】
代码 意义 类别 原因/采取的措施 POS显示的内容
0 承兑或交易成功 A 承兑或交易成功 交易成功
1 查发卡行 C 查发卡行 交易失败,请联系发卡行
2 查发卡行的特殊条件 C 可电话向发卡行查询 交易失败,请联系发卡行
3 无效商户 C 商户需要在银行或中心登记 商户未登记
4 没收卡 D 操作员没收卡 没收卡,请联系收单行
5 不予承兑 C 发卡不予承兑 交易失败,请联系发卡行
6 出错 E 发卡行故障 交易失败,请联系发卡行
7 特殊条件下没收卡 D 特殊条件下没收卡 没收卡,请联系收单行
9 请求正在处理中 B 重新提交交易请求 交易失败,请重试
12 无效交易 C 发卡行不支持的交易 交易失败,请重试
13 无效金额 B 金额为0 或太大 交易金额超限,请重试
14 无效卡号 B 卡种未在中心登记或读卡号有误 无效卡号,请联系发卡行
15 无此发卡行 C 此发卡行未与中心开通业务 此卡不能受理
19 重新送入交易 C 刷卡读取数据有误,可重新刷卡 交易失败,请联系发卡行
20 无效应答 C 无效应答 交易失败,请联系发卡行
21 不做任何处理 C 不做任何处理 交易失败,请联系发卡行
22 怀疑操作有误 C POS状态与中心不符,可重新签到 操作有误,请重试
23 不可接受的交易费 C 不可接受的交易费 交易失败,请联系发卡行
25 未能找到文件上记录 C 发卡行未能找到有关记录 交易失败,请联系发卡行
30 格式错误 C 格式错误 交易失败,请重试
31 银联不支持的银行 C 此发卡方未与中心开通业务 此卡不能受理
33 过期的卡 D 过期的卡,操作员可以没收 过期卡,请联系发卡行
34 有作弊嫌疑 D 有作弊嫌疑的卡,操作员可以没收 没收卡,请联系收单行
35 受卡方与安全保密部门联系 D 有作弊嫌疑的卡,操作员可以没收 没收卡,请联系收单行
36 受限制的卡 D 有作弊嫌疑的卡,操作员可以没收 此卡有误,请换卡重试
37 受卡方呼受理方安全保密部门(没收卡) D 有作弊嫌疑的卡,操作员可以没收 没收卡,请联系收单行
38 超过允许的PIN试输入 D 密码错次数超限,操作员可以没收 密码错误次数超限
39 无此信用卡帐户 C 可能刷卡操作有误 交易失败,请联系发卡行
40 请求的功能尚不支持 C 发卡行不支持的交易类型 交易失败,请联系发卡行
41 丢失卡 D 挂失的卡, 操作员可以没收 没收卡,请联系收单行
42 无此帐户 B 发卡行找不到此帐户 交易失败,请联系发卡方
43 被窃卡 D 被窃卡, 操作员可以没收 没收卡,请联系收单行
44 无此投资帐户 C 可能刷卡操作有误 交易失败,请联系发卡行
51 无足够的存款 C 帐户内余额不足 余额不足,请查询
52 无此支票账户 C 无此支票账户 交易失败,请联系发卡行
53 无此储蓄卡账户 C 无此储蓄卡账户 交易失败,请联系发卡行
54 过期的卡 C 过期的卡 过期卡,请联系发卡行
55 不正确的PIN C 密码输错 密码错,请重试
56 无此卡记录 C 发卡行找不到此帐户 交易失败,请联系发卡行
57 不允许持卡人进行的交易 C 不允许持卡人进行的交易 交易失败,请联系发卡行
58 不允许终端进行的交易 C 该商户不允许进行的交易 终端无效,请联系收单行或银联
59 有作弊嫌疑 C 交易失败,请联系发卡行
60 受卡方与安全保密部门联系 C 交易失败,请联系发卡行
61 超出取款金额限制 C 一次交易的金额太大 金额太大
62 受限制的卡 C 交易失败,请联系发卡行
63 违反安全保密规定 C 违反安全保密规定 交易失败,请联系发卡行
64 原始金额不正确 C 原始金额不正确 交易失败,请联系发卡行
65 超出取款次数限制 C 超出取款次数限制 超出取款次数限制
66 受卡方呼受理方安全保密部门 C 受卡方呼受理方安全保密部门 交易失败,请联系收单行或银联
67 捕捉(没收卡) C 捕捉(没收卡) 没收卡
68 收到的回答太迟 C 发卡行规定时间内没有回答 交易超时,请重试
75 允许的输入PIN次数超限 C 允许的输入PIN次数超限 密码错误次数超限
77 需要向网络中心签到 D POS批次与网络中心不一致 请向网络中心签到
79 脱机交易对帐不平 C POS终端上传的脱机数据对帐不平 POS终端重传脱机数据
90 日期切换正在处理 C 日期切换正在处理 交易失败,请稍后重试
91 发卡行或银联不能操作 C 电话查询发卡方或银联,可重作 交易失败,请稍后重试
92 金融机构或中间网络设施找不到或无法达到 C 电话查询发卡方或网络中心,可重作 交易失败,请稍后重试
93 交易违法、不能完成 C 交易违法、不能完成 交易失败,请联系发卡行
94 重复交易 C 查询网络中心,可重新签到作交易 交易失败,请稍后重试
95 调节控制错 C 调节控制错 交易失败,请稍后重试
96 系统异常、失效 C 发卡方或网络中心出现故障 交易失败,请稍后重试
97 POS终端号找不到 D 终端未在中心或银行登记 终端未登记,请联系收单行或银联
98 银联收不到发卡行应答 E 银联收不到发卡行应答 交易超时,请重试
99 PIN格式错 B 可重新签到作交易 校验错,请重新签到
A0 MAC校验错 B 可重新签到作交易 校验错,请重新签到

3. 在编译QT4.8.2出现 {standard input}:1025: Error: no such instruction: `swpb %cl,%al,[%edi]'

我之前在linux下编译QT 遇到过类似的错误 编译器配置错误的问题
修改/root/.bash_profile,把qmake路径改为*/mkspec/qws/arm-linux-g++

4. 交易渠道cups是什么意思

CUPS,全称是CHINA UNIONPAY SYSTEM,中文是“中国银联支付清算系统”。

在微信和支付宝等第三方支付尚未成为趋势之前,大部分人在取款、转账、付款时,会经常接触到ATM机、POS机等,这些都是基于CUPS系统实现的。

银联清算系统基本工作流程如下:

一、联机交易处理流程

  • 收单行交易系统将消费报文发送CUPS,CUPS将指令换发至发卡行。

  • 发卡行检查用户结算账户头寸(即借记卡账户余额或信用卡可用信用额度),进行账户扣款,完成持卡人结算账户实时结算动作,并将回复报文发送至CUSP。

  • CUPS更新交易数据,并将回复报文同步收单行的收单系统。

二、银联清算系统清分和资金划拨

  • T日23:00时,CUPS系统日切,并将当天联机交易日志同步给清算系统。

  • T+1日凌晨时,清算系统开始进行跨行清算和收单清算。

  • T+1日10:00时,清算系统将汇总后的清分结果,即:各机构清算账户、直联商户结算账户的应收(贷记)应付(借记)金额,发送至各机构进行确认。

  • 各机构对清分结果对账确认后,通知银联清算系统确认交易明细无误。

  • 清算系统开始进行资金划拨,通过资金管理平台和支付前置系统按序将支付指令发送至CNAPS,先借记后贷记。

  • 通过大额支付系统借记各机构在央行的备付金清算账户。

  • 通过小额支付系统贷记直连商户在银行开立的结算账户。

  • 通过大额支付系统贷记各机构在人行的备付金清算账户。

三、银行收单结算及内部核算

    资金清算完毕后,银行会收到央行支付系统报文,此时各机构银行获取其在央行备付金系统中各自的账户余额并与内部映射的虚拟账户余额进行对账,对账完毕后更新各自核算系统中“上存央行备付金账户”余额,并完成手续费的核算。对于间联商户的收单行,还需完成商户结算账户的核算和资金划拨。

5. Qt 软件中怎么自动加入build版本号

当进入解压好的源码包后,使用./configure –help命令,可以获得相应帮助,那我们只要选取参数部分看看 -release 这个参数显而易见,就是编译Qt以发布版的模式进行,一般来说,最后系统完成后,库就应该是发布版。 -release 与上面对应,自然是调试版了,如果开发的话,可以选择它吧。 -debug-and-release 囧,上面那两个的儿子。 -developer-build 囧,我错了,开发者也可以用这个的,选了这个后,可以进行自动测试,不过还没去用过,以后可以研究研究。 -opensource -commercial 这两个参数是指是编译是商业版本的,还是开源版本呢,视个人情况而定。 -shared -static 这两个参数是指Qt的lib以动态还是静态编译生成,这自然也是视个人需要的。 -no-fast -fast 这两个就很有关系,如果对自己的电脑性能很有信心,那就选第一个,那所有的工程文件都会生成到makefiles中,那编译的时间,估计可以看完变形金刚了。如果选第二个,那就加入子目录和库到makefiles,这样就能加快编译的速度。 -no-largefile -largefile 顾名思义,支不支持大文件,一般来说,嵌入式里是不会有从超过4G的大文件的,那就选第一个吧。 -no-exceptions -exceptions 计算机英语够好的人都该懂,这个自然就是异常情况,选则编译器支持抛出异常,否则不支持。 -no-accessibility -accessibility 可访问性的支持,说实话,这个我真不知道有什么有用了。等哪天发现了,再来好好解释。 -no-stl -stl 是都加入stl的支持,stl,这应该算是C++程序员应该都了解了,再不济,那也总听说过大名吧。 no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> 这 个可要好好说明下,一般来说,对于一个优秀的项目开发,数据库是必不可少的,qt也自带了大多数数据库驱动,可以完美地支持数据库的使用。对于数 据库的使用,我们可以直接qt驱动编译进去,或者以插件的形式编译进去。一般来说,最简单地就是直接编译进去,但使用插件形式的可以更加灵活,针对不同的 需求将驱动插件添加。其中,<>代表的是驱动名,如果我想直接添加sqlite的支持话,形式如下:-qt-sql-sqlite。其他名称 可以自己查看参数里,有详细地介绍。 -system-sqlite sqlite真受欢迎啊,当然那么优秀的嵌入式数据库,本人也是基本使用它来进行开发。这个参数意思是使用操作系统上的sqlite数据库,如果是不太会移植的,可以考虑直接使用qt自带的驱动。 -no-qt3support -qt3support 这个也是简洁易懂,加不加对qt3的支持。 no-xmlpatterns -xmlpatterns 选择对xml的支持,如果对网络无需求的话,就不用加了。 -no-phonon -phonon phonon是qt中处理多媒体的模块,比如放放视频什么来着,不过本人从没用过,也是根据需要选择的。 -no-phonon-backend -phonon-backend 与上面类似,只不过这两是以插件的形式加入支持。 -no-svg -svg 是否加入svg的支持,svg即可缩放矢量图形。 -no-webkit -webkit 是否加入webkit的支持,这可是个好东西,不过如果跟网络不搭界的话,还是不支持吧。 -no-scripttools -scripttools 是否加入脚本工具的支持,这对php等脚本工程师来说是个很棒的参数,但对于我这样菜鸟,就别提了。 -platform target 目标平台,这可是关键了,如果不注意的话,编译出来是x86上的话,哪怕是再牛的嵌入式工程师来也没法帮你移植到开发板上。通常,本人是linux-arm-g++。 -no-mmx -no-3dnow -no-sse -no-sse2 这四个参数是针对CPU的指令集,老实说,我也不甚了解,不过,对于开发并不是影响很大。 -qtnamespace 把qt的库封装到命名空间,没啥重要用处,依个人爱好加吧。 -qtlibinfix 将所有的qt的.so库重命名,也没啥大用处。 -no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> -system-sqlite 这是相当明显的,如果这都看不出来,,囧,那您一定比我近视(本人800度近视。。) 就 是说如果是-no-XX-,就说明编译时不选择这个参数,如过是-qt-XX-,说明我们可以编译直接选用qt自带的驱动,如果是 -plugin-XX-,就是将驱动以插件形式编译,而-system-XXX,当然是使用操作系统提供的驱动,不过那就需要您自己移植了,而且有时还要 用第三方的API,就方便来说非常麻烦,但是不排除您是牛人要好好玩玩的情况。 接下来,我们接着研究配置参数。 -qt-zlib -system-zlib 想 必经过上面的讲解,参数的意思已经很快得知,就是选择qt带的zlib库还是系统的zlib。zlib库是用于文件和资料压缩的库,对于新入嵌入式的人来 说,可能并无太大的用处,但是在以后的实际开发中,特别是对于多媒体图像图形的工程师来说,就肯定用到,因为图形图像的压缩都要使用或涉及到这个库。 -no-gif -qt-gif 这是选择gif的支持,如果选择qt支持的话,那在用qt开发的项目中,就能显示gif图,gif也是比较普遍的图片格式了,英文全称是Graphics Interchange Format。 -no-libtiff -qt-libtiff -system-libtiff tiff是一种非常复杂的光栅图像格式,并且有直接现成的C语言实现库,因此选择参数时就有了qt和system,一般来说,科学相关的开发里可能会用到。 -no-libpng -qt-libpng -system-libpng png的相关参数,一种非失真性压缩位图图形文件格式,其实就是为了替代gif搞出来的,也是随实际需要来选择,当然,也有C语言实现的库。 -no-libmng -qt-libmng -system-libmng 大汗,大汗,这可是超级罕见的东西,QT竟然也能支持,说实话,这个参数我看来就是无视的。MNG是多帧PNG动画格式,结构极其复杂,基本没人用。 -no-libjpeg -qt-libjpeg -system-libjpeg jpeg,这么有名的图片格式也不用说了,随需要选择吧。 -no-openssl -openssl -openssl-linked SSL,Security Socket Layer,是一个安全传输协议,在Internet网上进行数据保护和身份确认,而OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件 包,在qt中,我们可以选择直接支持,或者OpenSSL链接支持,这个参数也是为有需要者提供的。 以上是第三方库的参数选择,紧接着就是qt附加参数,在附加参数里,我们可以指定编译的部分及加入参数来获取信息。 -make -nomake 一 句话,说明,就说我可以这两个参数选择哪些我要编译,哪些我不需要,在 libs tools examples demos docs translations这些里你可以选择,比如examples,并不重要,可以放在-nomake后,这样编译过程中就不会编译这部分了。通过适当的 选择,我们可以大大加快编译的速度,这对配置较差的机子来说有着积极意义。 -R <string> -l <string> 这两个参数是为编译时增加一个库的运行路径及头文件的路径,比如使用tslib作为开发触摸驱动时,我们就应使用这两个参数来指定tslib的库路径和头文件路径。 -no-rpath -rpath 这个参数比较难于理解,简单地说,就是告诉动态加载器,到-rpath指定的目录中寻找编译时须要的动态链接库,语法就与上面的参数结合,比如 -rpath -R/home/xxxx。 -continue 这个参数的作用就是当出现错误时依然进行配置编译,换我是不会加上的。 -verbose, -v 这个参数就很眼熟,在前面的文章中有过详细介绍,简言之,就是显示配置的每一步的具体信息。 -no-optimized-qmake -optimized-qmake 是否编译生成优化过的qmake,没啥大用,也属于可有可无的参数。 -no-nis -nis 是否编译NIS支持,NIS(网络信息服务)是一个提供目录服务的RPC(远程过程调用)应用服务,当然没网络需要的可以再次华丽地无视。 -no-cups -cups 是 否编译CUPS支持,是不是想问什么用啊?~~~~囧,开打印店用的。好了,不说冷笑话,CUPS给Unix/Linux用户提供了一种可靠有效 的方法来管理打印。它支持IPP,并提供了LPD,SMB(服务消息块,如配置为微软WINDOWS的打印机)、JetDirect等接口。CUPS还可 以浏览网络打印机。它的开发提供者是大名鼎鼎的“水果生产商”----苹果公司。 -no-iconv -iconv 选择是否编译iconv支持,iconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。这对跨语言Qt开发人员来说是很有用的,当然,考虑到中文的编码,我也选择加入支持。 -no-pch -pch 是 否支持预编译过的头文件。预编译头就是把一个工程中的一部分代码,预先编译好放在一个文件里(通常以.pch为扩展名),这个文件就称为预编译头 文件。这些预先编译好的代码在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。妈妈经常说:不懂就要学。我说:不 懂就加上。。。 no-dbus -dbus -dbus-linked 是否编译编译QtDBus模块。dbus是freedesktop下开源的Linux IPC通信机制,本身Linux 的IPC通信机制包括,管道(fifo),共享内存,信号量,消息队列,Socket等。在Qt中DBUS是有单独的模块的,可见其重要性。 -rece-relocations 对于额外的库链接器优化,可以减少编译中的再定位。 no-separate-debug-info -separate-debug-info 是否存储debug信息在.debug,一般为了查错,还是选择存储吧。 -xplatform target 相当浅显的参数,即交叉编译的目标平台,一般来说根据你所要移植的目标板来确定。 -no-feature-<feature> -feature-<feature> 选 取qte的feature编译,对于这个,我理解为特性,特性的描述你可以参考src/corelib/global/qfeatures.txt,在这 里面对于每个特性都有比较充分的讲解。对于特性地选择,也是要根据开发需求进行,如果裁剪适当,能大大为qte库瘦身。 -embedded <arch> 嵌入式平台架构选择,可以选择arm,mips,x86及generic,视你的目标平台决定吧。 -armfpa -no-armfpa 这个参数也只是针对ARM平台的,是否加入对于基于ARM的浮点数格式的支持,通常,这个参数在编译时会自动选择。 -little-endian -big-endian 目标平台的大端和小端选择,这应该是常识了,如果这不知道,就不要来混嵌入式了 -host-little-endian -host-big-endia 主机平台的大端和小端选择,属于鸡肋的参数,不选择也会在配置时自动选择。 -no-freetype -qt-freetype -system-freetype 选择freetype,FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,在嵌入式开发中,有套可使用的字体对于中文开发至关重要,本人一般使用文泉驿字体。 -qconfig local 使用本地的qconfig配置文件来替代全部参数配置,有需要的可以去研究下,可以裁剪控件级别的参数。 -depths <list> 显示的像素位深,也是根据需要来进行吧。 -qt-decoration-<style> -plugin-decoration-<style> -no-decoration-<style> 这个是选择qt的样式风格,对于需要美化界面的项目来说,可以好好选择下。 -no-opengl -opengl <api> 是否加入opengl的支持,OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。不过对于一般的开发来说,似乎有很少用到的地方。 -qt-gfx-<driver> -plugin-gfx-<driver> -no-gfx-<driver> 这个是相当重要的一个参数,选择QtGui的图形显示驱动,比如我们在pc上使用qvfb模拟时,就应该加入对qfvb的支持。我们可以在 linuxfb,transformed,qvfb,vnc,multiscreen这几个中选择。在平常的开发板上,选择linuxfb即可。 -qt-kbd-<driver> -plugin-kbd-<driver> -no-kbd-<driver> 选择键盘的驱动支持,可以支持usb键盘,串口键盘等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中选择。 qt-mouse-<driver> -plugin-mouse-<driver> -no-mouse-<driver> 鼠标的驱动支持,一般都会选择tslib,可以完美地支持触摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中选择吧。 -iwmmxt 加入iWMMXt指令的编译,也只是部分XScale架构才具有。 -no-glib -glib 是否加入glib库的支持,glib库对应即gtk库,就也是说加入后可以使用gtk。

6. 如何在Windows下构建ARM Linux QT开发环境

准备工作:
首先,最不可思议的,是要在Linux下把QT编译一遍,因为库都是一样的,需要的就是一些Windows下的qmake、moc、uic之类的工具而已。因为QT源码很多地方不能在Windows下面交叉编译通过,虽然我改了一些代码和配置(一会儿我贴出补丁来),但我只用它编译了qtbase、qtdeclarative这两个模块和qttools模块中的一部分。
Linux下的编译可以参照我之前写的这篇文章。参考配置:
开发包:
./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
运行库:
./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
做完这一步,你获得两样东西,sysroot和linux下的ARM QT开发文件。sysroot是编译QT之前,用Buildroot做的开发用根目录。这两个东西都要拷贝到Windows里,因为Windows不支持符号连接,拷贝需要需要去掉这些连接,这么做:
cp [源目录] [目标目录] -Lr
第二,需要一个Windows下模拟Linux环境的东西和编译器,我用的是MSYS和MinGW,因为他们编译出来的程序比Cygwin快。在这里可以找到:http://www.mingw.org/。
第三,需要Linaro ARM GCC编译器,Windows版本的。在这里可以找到:http://www.linaro.org/downloads/
第四,需要python,Windows版本的。在这里可以找到:https://www.python.org/downloads/
下载、安装,然后在MSYS根目录的/etc/profile里面export PATH=$PATH:[Python安装目录]
第五,需要pkg-config,Windows版本的,这个比较麻烦,需要下载以下三个文件,并提取出我们需要的东西:
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
(提取pkg-config.exe)
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip
(提取libglib-2.0-0.dll)
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)
把他们都放到MSYS的bin目录下,然后给pkg-config.exe做一个脚本pkg-config,因为下载的pkg-config.exe比较蠢,在同时指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR这两个环境变量的时候,第一个cflags会输出两次PKG_CONFIG_SYSROOT_DIR。这么做这个脚本:
#!/bin/sh
pushd / > /dev/null
ROOTDIR=`pwd -W 2>/dev/null`
popd > /dev/null
SYSROOT=$PKG_CONFIG_SYSROOT_DIR
pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"
最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源码和我的补丁。
我的补丁如下:
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800
@@ -4022,6 +4022,10 @@
done

(cd "$outpath/qmake"; "$MAKE") || exit 2
+ if [ -e "$outpath/bin/qmake.exe" ]; then
+ echo '#!/bin/sh' > "$outpath/bin/qmake"
+ echo "$outpath/bin/qmake.exe" '"$@"' "-unix" >> "$outpath/bin/qmake"
+ fi
fi # Build qmake

echo "Running configuration tests..."
@@ -4091,9 +4095,9 @@
# when xcompiling, check environment to see if it's actually usable
if [ -z "$PKG_CONFIG_LIBDIR" ]; then
if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig\;$CFG_SYSROOT/usr/share/pkgconfig
if [ -n "$GCC_MACHINE_DUMP" ]; then
- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR\;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
fi
export PKG_CONFIG_LIBDIR
echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800
@@ -11,14 +11,21 @@
include(../common/g++-unix.conf)

# modifications to g++.conf
-QMAKE_CC = arm-linux-gnueabi-gcc
-QMAKE_CXX = arm-linux-gnueabi-g++
-QMAKE_LINK = arm-linux-gnueabi-g++
-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
+QMAKE_CC = arm-linux-gnueabihf-gcc
+QMAKE_CXX = arm-linux-gnueabihf-g++
+QMAKE_LINK = arm-linux-gnueabihf-g++
+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
-QMAKE_AR = arm-linux-gnueabi-ar cqs
-QMAKE_OBJCOPY = arm-linux-gnueabi-obj
-QMAKE_NM = arm-linux-gnueabi-nm -P
-QMAKE_STRIP = arm-linux-gnueabi-strip
+QMAKE_AR = arm-linux-gnueabihf-ar cqs
+QMAKE_OBJCOPY = arm-linux-gnueabihf-obj
+QMAKE_NM = arm-linux-gnueabihf-nm -P
+QMAKE_STRIP = arm-linux-gnueabihf-strip
+
+# support for OpenGL
+QMAKE_LIBS_EGL = -lEGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+#QMAKE_LIBS +=
+
load(qt_config)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800
@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();
QString dstf = (*oit).toQString();
- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)
- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t");
+ t << escapeDependencyPath(dstf).replace(QRegExp("\\\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\\\"), "/")
+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\\\"), "/").join(" \\\n\t\t");

ProKey comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
@@ -3346,6 +3346,8 @@
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
+ QString src_p = src;
+ QString dst_p = dst;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
@@ -3362,7 +3364,7 @@
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " \"" + src + "\" >\"" + dst + "\"";
+ ret += " \"" + src_p.replace(QRegExp("\\\\"), "/") + "\" >\"" + dst_p.replace(QRegExp("\\\\"), "/") + "\"";
}
return ret;
}

struct TermChain {
TermChain(PatternTerm term)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private

qtHaveMole(qmldevtools-private) {
接下来开始配置:

其中-extprefix定义安装位置,在编译完以后可以改,一会儿说;-prefix、-plugindir、-importdir、-qmldir定义的位置是目标板上的位置,加双斜杠是为了防止MSYS翻译这些路径成MSYS的路径,其他的设定与Linux下的编译没有不同。Linux下编译的sysroot可以拷贝到例如:E:/MinGW/opt/sysroot-arm。
然后编译
make mole-qtbase
make mole-qtdeclarative
cd qttools/src/linguist
../../../qtbase/bin/qmake.exe -unix linguist.pro
make
编译的时候可能会有几个库有链接错误,找不到一大堆gl、egl打头的函数,这是因为相应的Makefile里面的LIBS没有自动加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的时候不会,很奇怪;因为也就几个地方,出问题了手工加一下吧,我没去查原因改代码。
编译linguist的时候可能会遇到这个问题:http://qt-project.org/forums/viewthread/33370,按里面说的处理。
编译完了以后,把下列文件拷贝到Linux下编译的ARM QT开发包的bin目录中去:

然后,删掉对应的ARM QT开发包的bin目录中没有exe后缀的文件,那些是Linux下的。
最后一步,确保安装路径正确,也就是说,如果配置Windows下QT的时候设定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替换过exe文件的ARM QT开发包放到这个位置,如果路径改了,可以用二进制搜索工具去qmake.exe中替换这个字串。
补充一下关于调试的问题,其实不是很关键。
在使用Debug模式编译的时候,最后会出现如下提示:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
这是因为在mkspecs/features/unix/gdb_dwarf_index.prf中,有这样一段:
QMAKE_GDB_INDEX += \
test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \
gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' && \
test -f $(TARGET).gdb-index && \
$$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \
$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很显然,这段代码把调试用的GDB默认为“gdb”了,所以应该改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,这里的sed对GDB版本的判断,无法识别像“GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs”这样的版本信息的,只能识别像“GNU gdb (GDB) 7.6.1”这样的版本信息,所以你有可能看不到刚才那段提示。想解决,要么重新写一段sed的正则表达式,要么直接就把这个test ... -gt 72删掉。

7. 如何将freemodbus协议栈移植到linux下

(二)在HHARM2410-R3上的移植
完成了在普通red hat上的安装,熟悉了蓝牙协议栈一些基本的东西,下面的任务就是把协议栈搬到开发板上了。
第一步当然是内核了,由于华恒的内核代码改过,我也不知道从bluez上下载的patch能不能使用,试试看了,只好。
# cd /HHARM2410/kernel
# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1
# find ./ -name '*rej'
./fs/cramfs/inode.c.rej
不好,有文件不能patch,看看是针对cramfs文件系统的patch,我也不清楚为什么bluez的patch会修改到cramfs,不过我想 问题应该不大。内核源代码关于bluetooth的部分华恒应该没有改过,因此patch的主要部分应该是没有问题的。如果内核编译后发生问题,我想大概 也只有把内核代码翻出来看了。
先就这样了,用用试试看好了。与普通pc上的类似,只不过有些是m的现在统统为y了。我的配置关于Bluez的部分设置为:
#
# Bluetooth support
#
CONFIG_BLUEZ=y
CONFIG_BLUEZ_L2CAP=y
# CONFIG_BLUEZ_SCO is not set
CONFIG_BLUEZ_RFCOMM=y
CONFIG_BLUEZ_RFCOMM_TTY=y
CONFIG_BLUEZ_BNEP=y
CONFIG_BLUEZ_BNEP_MC_FILTER=y
CONFIG_BLUEZ_BNEP_PROTO_FILTER=y
# CONFIG_BLUEZ_HIDP is not set
#
# Bluetooth device drivers
#
CONFIG_BLUEZ_HCIUSB=y
# CONFIG_BLUEZ_HCIUSB_SCO is not set
# CONFIG_BLUEZ_HCIUART is not set
# CONFIG_BLUEZ_HCIBFUSB is not set
# CONFIG_BLUEZ_HCIDTL1 is not set
# CONFIG_BLUEZ_HCIBT3C is not set
# CONFIG_BLUEZ_HCIBLUECARD is not set
# CONFIG_BLUEZ_HCIBTUART is not set
# CONFIG_BLUEZ_HCIVHCI is not set

device部分就设了个USB的,其他的就不设置了。
下面继续make dep;make zImage的常规过程,OK,没有发生编译问题,可以稍微舒口气了。
下面要移植Bluez的基础库了,在Redhat 9下执行
# ldd /usr/lib/libbluetooth.so.1.0.17
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
发现没有依赖什么莫名其妙的库,应该换个编译器就可以了,configure一下就可以了。我的配置命令很简单:
# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
# make install
OK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚为什么,居然只有.a和.la的静态库,没有动态库。只好自己动手,到bluz-libs-2.17/src/下,自己编译动态库:
# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o
再做两个符号连接
# ln -s libbluetooth.so.1.0.17 libbluetooth.so
# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1
好了,库交叉编译完毕,mv到/HHARM2410/application/bluezport/libs/lib文件夹下就可以了。

接着移植Bluez的工具集。与库类似,先看一下各个程序需要用到什么库,比如:
#ldd /usr/sbin/hcid
libbluetooth.so.1 => /usr/lib/libbluetooth.so.1 (0x40035000)
libc.so.6 => /lib/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
挨个试试需要用的工具,发现需要的库华恒和Bluez都提供了,应该换个编译器编译一下就可以了。编译之前我为了到板子上与我自己的手机连接方便修改 了bluez-utils-2.17/hcid/security.c文件,在init_security_data函数中的设置默认的密码,非常简单地 改了两行:
strcpy(hcid.pin_code, "123");
hcid.pin_len = 3;
然后configure我想就行了,我的configure设置为:
# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
我在这步make的时候出现了一点小错误,好像是说PATH_MAX没有定义,这个是LINUX设置的存放路径名缓冲区的最大长度。应该是少包含了一个头文件造成的。我没有去仔细考究,就在当前文件下的config.h中添加了三行:
#ifndef PATH_MAX
#define PATH_MAX 4095/* PAGE_SIZE - 1 */
#endif
采用简单粗鲁的添加定义的方式。再make,通过。
# make install
好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了
最后,由于在PC的LINUX下的默认pin_helper /usr/bin/bluepin是用python写的代码,在2410上当然不能用了,所以要自己写一个pin_helper的程序。翻翻 /usr/bin/bluepin的代码以及hcid/security.c的代码,事实上hcid进程在验证PIN code的时候开了一个pipe指向pin_helper进程的标准输出,pin_helper进程向用户询问PIN code,如果用户输入密码XXXX就以"PIN:XXXX"的形式写到标准输出中去,如果用户reject就写个"ERR"回去。
我以一种最简单的方式实现pin_helper程序,即固定地写一个code回去,比如123,牺牲安全性。
用脚本实现就是:
#!/bin/sh

echo "PIN:123"
用C实现一个就是:
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("PIN:123");
}
交叉编译成my_pin_helper再放到板子的/usr/bin下,那么就可以把板子的hcid.conf修改成:
pin_helper /usr/pin/my_pin_helper
后来,我在板子上也用MiniGUI写了一个pin_helper,也挺简单的。

好了,一切准备完毕,做好ramdisk,记得在/dev下mknod几个rfcomm,放到板子上,可以运行!
插上USB适配器,连模块都不用probe
# hciconfig hci0 up
# hcid -f /etc/bluetooth/hcid.conf
# hciconfig -a

8. 如何安装arm-linux-gcc

这是readme文件 1.arm-gcc-4.4.1-20100409.tar.gz 交叉编译器,将其解压 tar zxvf arm-gcc-4.4.1-20100409.tar.gz 到当前目录 当前目录将出现usr/local/arm/4.4.1的目录,将其中的arm目录拷贝到 /usr/local/arm目录 在/etc/profile下增加 export PATH=$PATH:/usr/local/arm/4.4.1/bin 然后 source /etc/profile 这样交叉编译器安装成功 2.qtopia-core-opensource-src-4.2.2.tar.gz qt交叉编译库 解压缩 拷贝 qmake.conf 到 mkspecs/qws/linux-arm-g++目录 替换原有文件 ./configure -embedded arm -DQT_QLOCALE_USES_FCVT \ -qt-mouse-pc -qt-freetype -no-cups -no-nis -no-iconv \ -no-qdbus -qt-libjpeg -qt-libpng -qt-gif -qt-zlib \ -no-rpath -no-qt3support -no-largefile -no-accessibility \ -no-stl -no-libmng -little-endian -prefix /opt/QtPalmtop 提示第一次输入yes 回车 第二次直接回车 sudo make; sudo make install 这样将qt交叉编译库安装到/opt/QtPalmtop下 增加/opt/QtPalmtop到nfs共享 开发板上将该共享目录mnt到/opt/QtPalmtop下 在开发板上修改/etc/profile,增加三行 export LD_LIBRARY_PATH=/opt/QtPalmtop/lib export QWS_DISPLAY="LinuxFb:/dev/fb1" export QWS_SIZE="800*480" 利用其交叉编译qt程序 /opt/QtPalmtop/bin/qmake -project /opt/QtPalmtop/bin/qmake make 将其qt程序目录通过nfs共享到开发板,在开发板上运行 在开发板/etc/init.d/rcS文件增加运行的程序: mount pc机器相关目录 运行程序 cd /sdcard/project_stu && ./project_stu -qws -nomouse & cd /sdcard && ./mplayer -x 540 -y 350 (某一个开发板上的视频文件名)

热点内容
linux的gz解压命令 发布:2024-05-05 18:24:13 浏览:309
服务器机柜属于什么辐射 发布:2024-05-05 18:02:10 浏览:335
存储成本计算 发布:2024-05-05 18:02:10 浏览:583
如何把手机改安卓10 发布:2024-05-05 17:39:07 浏览:497
我的世界怎么扩容服务器内存 发布:2024-05-05 17:19:54 浏览:48
java读取文件字符 发布:2024-05-05 17:15:18 浏览:11
三星怎么应用加密 发布:2024-05-05 17:13:18 浏览:152
cad字体在那个文件夹 发布:2024-05-05 17:08:20 浏览:331
什么时候用编译器 发布:2024-05-05 17:08:20 浏览:766
应急救援脚本 发布:2024-05-05 17:08:17 浏览:338