Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1370116
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: LINUX

2012-08-06 09:04:55

本文主要是记录下我在这整个过程中所遇到的问题及解决方法,主要的过程网上很多文章都写过了,我只是补充些我自己的看法及问题。这可以

说是一个痛苦的过程,因为各种问题不断,困扰了我很,不过黄天不负有心人,终于完成了我的最终目标——移植Qt4.7.3到开发板上了。
先说下我使用的环境:

主机:Redhat
开发板linux内核:2.6.23
工具链:arm-none-linux-gnueabi-gcc 4.3.2

一、重新编译内核及文件系统

    因为原来的内核及文件系统是用3.4.1的交叉编译器编译的,版本太老了,编译QT产生很多错,所以使用新的交叉编译器重新编译一下。但

偏偏就是这个过程出了很多我始料不及的状况。先说下我所参考的文章,是友善之臂的《Mini2440 Linux移植开发实战指南》,这篇文章写得很

详细。移植的部分我就不用做了,只需要重新编译一下。后来发现文件系统怎么都挂不上去,内核可以启动成功,但总是停在Freeing init 

memory:这儿,控制台怎么都出不来。后来看了内核的源代码,发现是busybox执行失败。为什么呢,我刚开始时总是找编译busybox的原因,后

来网上人们说要打开内核的EABI选项,因为4.0以后的gcc编译器是支持EABI的,所以编译出来的的程序也是支持EABI的,因此内核也要支持。好

吧,重新编译下内核。具体要改的地方是make menuconfig时

在Kernel Features里勾选上EABI的支持.
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW)

编译内核时还有个错误undefined reference to `__aeabi_uldivmod',上网查了说是GCC4.3对代码的优化导致的。打开Makefile修改

KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                                        -fno-strict-aliasing -fno-common \
                                       -Werror-implicit-function-declaration

找到这里,增加一行

KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                                        -fno-strict-aliasing -fno-common \
                                        -Werror-implicit-function-declaration \

                                       -fno-tree-scev-cprop 
编译通过。

    然后再把busybox生成的文件系统做成镜像,这下就OK啦。

    在这里的经验教训是,最好系统中只安装一个工具链,安装多了的话,可能因为环境变量没设好而导致工具链的混用。编译内核及文件系统

和以后的各种程序只用同一个编译器。另外要说一下,我曾经用过4.4.3的交叉编译器,好像也会导致文件系统挂不上,所以最好使用4.3.2的吧

。再说一遍,如果程序运行有什么问题,请首先检查编译器的匹配。

二、移植Qt4.7.3

    首先推荐两篇写得很好的文章,移植tslib和QT的

http://blog.csdn.net/lanmanck/article/details/4303213
http://blog.csdn.net/wwd574000815/archive/2011/04/02/6298480.aspx

    编译时还有个错误:

lib/libQtGui.so: undefined reference to `ts_read_raw'
/lib/libQtGui.so: undefined reference to `ts_open'
/lib/libQtGui.so: undefined reference to `ts_fd'
/lib/libQtGui.so: undefined reference to `ts_config'
/lib/libQtGui.so: undefined reference to `ts_close'
/lib/libQtGui.so: undefined reference to `ts_read

解决办法:

'修改qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts参数):

QMAKE_CC                = arm-linux-gcc -lts
QMAKE_CXX               = arm-linux-g++ -lts
QMAKE_LINK              = arm-linux-g++ -lts
QMAKE_LINK_SHLIB        = arm-linux-g++ -lts

    以上两篇文章基本上都把过程讲的很清楚了。照着上面说的做基本不会有什么问题,我再补充一点我自己碰到的小问题。我把QT移植到270

上之后,运行程序会出现erro while loading shared libraries:libstdc++.so什么的。这个库我在编译器里找了老半天没找着,真是郁闷啊,

把ubuntu的库拷进去是肯定不行的,后来偶然在网上看到相关的东西,才知道原来这个东东在/usr/local/arm/4.3.2/arm-none-linux-

gnueabi/armv4t/usr/lib/libstdc++.so.6

    真是找得好辛苦啊。二话不说,复制到270的文件系统的lib中。于是QT应用程序就运行成功了。

    另外补充一下,运行QT程序会出现Segmentation Fault一般都是编译器问题,要注意交叉编译QT库所用的编译器和文件系统的一样。
阅读(2969) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~