Qt 移植时出现编译错误
创始人
2024-08-02 11:01:35
0

Qt 移植时出现编译错误是本文要介绍的内容,问题的解决,我们先来看内容。决定开始 移植Linux到mini2440。首先就是在ubuntu下建立交叉编译工具链。借着在Fedora 下建立ARM-Linux的交叉编译工具的经验,按理说应该是不会有问题的,但是结果是比在Fedora下碰到的问题多得多了。以下先介绍成功编译的过程,碰到的问题和解决办法后面说。

这次编译过程中对我有重大帮助的资料有:

  1. 《 编译Mysql时configure: error: No curses/termcap library found 的错误解决方法》  
  2. 《[原创]在ubuntu下动手编译arm-elf工具》  
  3. 《在ubuntu下使用crosstool制作交叉编译工具》  
  4. 《 ubuntu 8.04中编译ARM交叉平台的一点心得!》 

关于crosstool的基本知识在我以前的

  1. 《在 Fedora 下建立 ARM-Linux 交叉编译环境》 

中已有介绍,这里我再多说,以下是具体过程:
(1)保证你的ubuntu8.10下安装了以下软件开发工 具。 Bison flex build-essential patch [color="#ff0000"]libncurses5-dev 我并没有试过没装这些工具的后果,都是网上的经验,你要是不信这个邪,就自己吃吃这个螃蟹。

(2)因为ubuntu8.10自带的是gcc-4.3.2无法用crosstool正常编译交叉编译器,所以必须安装gcc-4.1,但是不必卸载 4.3.2。方法是用新立得软件包管理器安装gcc-4.1,之后 参考

chinazcw的方法 sudo rm /usr/bin/gcc (删除GCC,它只是个到gcc-4.3.2的软连接文件)  

sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc 建立GCC到gcc-4.1的软连接) 

(3)如果你运行ls -la /bin/sh

命令看到/bin/sh其实是一个指向dash的软链接,则请运行以下命令,将/bin/sh链接到bash。sudo mv /bin/sh /bin/sh.oldsudo ln -sf bash /bin/sh

(4)按照老方法修改crosstool的文件:demo-arm9tdmi.sh、gcc-4.1.1-glibc-2.3.2.dat,最后运行demo-arm9tdmi.sh。这些过程请参考我以前的文档

  1. 《在 Fedora 下建立 ARM-Linux 交叉编译环境》。 

过程就这么简单,但是有些是用失败换来的。下面介绍下我的编译血泪史:     一开始,我并不想用gcc-4.1而是想用自带的gcc-4.3.2,然后...
  
(1)编译到glibc的时候,在配置的时候会检测gcc的版本,configure 脚本认为gcc-4.3.2版本太老(其实是因为当时gcc还没有这么高的版本,只要不是3.2到4.1之间的版本,都认为too old),不能编译。

这是可以解决的,方法就是修改glibc-2.3.2根目录下 的configure 文件中的第1275行:

  1. test -n "$CC" && breakdoneif test -z "$CC";  
  2.  then  ac_verc_fail=yeselse   
  3.   # Found it, now check the version.   
  4.    echo "$as_me:$LINENO: checking version of $CC" >&5echo $ECHO_N "checking version of $CC... $ECHO_C" >
  5. &6  ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`  case $ac_prog_version in    '') 
  6. ac_prog_version="v. ?.??, bad";  
  7.     ac_verc_fail=yes;;    
  8.       3.[2-9]*|4.[[color="#ff0000"]0-3]*)     
  9.     ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;    *) ac_prog_version="$ac_prog_version, bad";  
  10.    ac_verc_fail=yes;; 

这样就可以骗过configure ,继续编译下去。

但是修改的时机要把握好,要在 demo-arm9tdmi.sh解压完glibc-2.3.2后,运行其configure之前。我直接就将configure拷出来,修改后在crosstool解压完所有文件后直接覆盖源文件。
其实这种方法我在fedora9下使用crosstool时就用过,但是当时发现f9真是做得比f8差,历史的倒退,所以就到回去用f8了,就没写文章总结。

(2)编译gcc-3.3.6的时候,出现以下错误:/usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments

这纯属软件bug,因为使用open函数的时候,如果在第二个参数中使用了 O_CREAT,就必须添加第三个参数:创建文件时赋予的初始权限。 而在gcc-3.3.6/gcc/的collect2.c文件中有漏掉第三个参数的错误,而gcc-4.3对语法错误的检查严格是出了名的(4.1就不会 因此错误退出),所以就退出了。    这也是可以解决的,就是在gcc-3.3.6/gcc/collect2.c中的第1575行改为:

  1. redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, [color="#ff0000"]0777); 

我还发现glibc-2.3.2/login/tst-grantpt.c也有一个类似错误,一起改过来,除后患。第44行:fd = open (file, O_RDWR | O_CREAT, [color="#ff0000"]0777);

修改的时机也要把握好,我是在crosstool解压完所有文件后和之前configure 文件一起直接覆盖源文件。

(3)经历了以上的痛苦后,继续编译,会出现以下错误:*** buffer overflow detected ***: arm-9tdmi-linux-gnu-ar terminated

fuck!!!!!!!!编译出来的 arm-9tdmi-linux-gnu-ar根本没法用!被耍了!放弃gcc-4.3.2!!!!!   要是哪位仁兄解决了以上问题,并编译成功,一定要通知小弟啊!

(4)安装了gcc-4.1之后,重新编译。心想这回好了吧?!不想,有出了以下错误:In [color="#ff0000"]file included from

  1. version.c:33:/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2
  2. /build-glibc/csu/version-info.h:2:1: missing terminating "[color="#000000"]character/home/tekkaman/working/crosstool-0.43/build/
  3. arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating "character 

google后发现,原来是ubuntu将系统默认的shell设置成了dash (the Debian Almquist Shell),所以通过脚本生成的文件格式和bash的不一样,导致了编译错误。在使用了ursa的方法后问题解决。

  1. sudo mv /bin/sh /bin/sh.oldsudo ln -sf bash /bin/sh 

(5)继续重新编译,在gcc做好后(此时gcc已可用,只是gdb还没编译好),编译gdb的时候出了以下错误:

  1. configure: error: no termcap library found 

很显然,是因为没装一个库文件造成的,google后发现正解:用新立得安装libncurses5-dev(或是apt-get install libncurses5-dev)即可。  

最后,编译成功,看到了盼望已久的“done”。

小结:关于Qt 移植时出现编译错误的内容介绍完了,希望本文对你有所帮助!

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...