先说下我使用的环境:
主机:Ubuntu10.04
开发板linux内核:2.6.24
工具链:友善之臂网站下载的arm-linux-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移植到2440上之后,运行程序会出现erro while loading shared libraries:libstdc++.so什么的。这个库我在编译器里找了老半天没找着,真是郁闷啊,把ubuntu的库拷进去是肯定不行的,后来偶然在网上看到相关的东西,才知道原来这个东东在/usr/local/arm/4.3.2/arm-none-linux-gnueabi/armv4t/usr/lib/libstdc++.so.6
真是找得好辛苦啊。二话不说,复制到2440的文件系统的lib中。于是QT应用程序就运行成功了。
另外补充一下,运行QT程序会出现Segmentation Fault一般都是编译器问题,要注意交叉编译QT库所用的编译器和文件系统的一样。