S3C2440重新编译内核及移植QT4.7.3

来源:互联网 发布:厦大网络继续教育学院 编辑:程序博客网 时间:2024/05/21 16:55
360人阅读 评论(0)收藏 举报
 本文主要是记录下我在这整个过程中所遇到的问题及解决方法,主要的过程网上很多文章都写过了,我只是补充些我自己的看法及问题。这可以说是一个痛苦的过程,因为各种问题不断,困扰了我很,不过黄天不负有心人,终于完成了我的最终目标——移植Qt4.7.3到开发板上了。

先说下我使用的环境:

主机: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库所用的编译器和文件系统的一样。

0 0
原创粉丝点击