本文主要是记录下我在这整个过程中所遇到的问题及解决方法,主要的过程网上很多文章都写过了,我只是补充些我自己的看法及问题。这可以
说是一个痛苦的过程,因为各种问题不断,困扰了我很,不过黄天不负有心人,终于完成了我的最终目标——移植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库所用的编译器和文件系统的一样。
阅读(2972) | 评论(0) | 转发(1) |