天嵌 ARM开发社区

 找回密码
 注册
查看: 3948|回复: 2

Qt 4.5编译时出现libQtCore.so: undefined reference to“……”错误

[复制链接]
明何 发表于 2012-4-22 19:41:06 | 显示全部楼层 |阅读模式
本帖最后由 明何 于 2012-4-22 20:06 编辑

首先介绍下编译环境:
ARM板上:
重新烧写了2.6.30的内核
用的是Qt4.5的文件系统
PC机器:
使用的是ubuntu 11.04
已经弄了4.3.3版本和3.4.5的交叉编译器,但是不知道为什么使用arm-linux-g++ -v时候查询的又是gcc version 3.4.5。这东西怎么改我也不清楚
已经装上了资料盘中的qt-embedded-linux-opensource-src-4.5.0。arm版本的已经没有问题了。
然后qt-creator-linux-x86-opensource-1.3.0.bin也给顺便装了。
在终端这样使用环境变量:
  1. source setARM_env
复制代码
然后正常make,生成了一个可执行文件。接着我就把hello_cn复制到了ARM板子上。结果提示(我传过来的时候改了名字)
  1. [root@EmbedSky bin]# pwd
  2. /opt/qt-4.5/bin
  3. [root@EmbedSky bin]# ./myhello
  4. -/bin/sh: ./myhello: not found
  5. [root@EmbedSky bin]#
复制代码


想了半天,觉得可能是编译的时候内核版本的问题,回电脑后查结果是这样的。
  1. root@minghe-Inspiron-1420:/opt/EmbedSky/qt-4.5/pro/hello_cn# file hello_cn
  2. hello_cn: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
复制代码




然后我就做了一个修改:

/opt/EmbedSky/qt-4.5/__install/arm/mkspecs/qws/linux-arm-g++/qmake.conf中的内容修改成了:
  1. #
  2. # qmake configuration for building with arm-linux-g++
  3. #

  4. include(../../common/g++.conf)
  5. include(../../common/linux.conf)
  6. include(../../common/qws.conf)

  7. # modifications to g++.conf
  8. QMAKE_CC                = /opt/EmbedSky/4.3.3/bin/arm-linux-gcc
  9. QMAKE_CXX               = /opt/EmbedSky/4.3.3/bin/arm-linux-g++
  10. QMAKE_LINK              = /opt/EmbedSky/4.3.3/bin/arm-linux-g++
  11. QMAKE_LINK_SHLIB        = /opt/EmbedSky/4.3.3/bin/arm-linux-g++

  12. # modifications to linux.conf
  13. QMAKE_AR                = arm-linux-ar cqs
  14. QMAKE_OBJCOPY           = arm-linux-objcopy
  15. QMAKE_STRIP             = arm-linux-strip

  16. load(qt_config)
复制代码



现在在编译自带的pro中的hello_cn时遇到以下错误:
  1. /opt/EmbedSky/qt-4.5/__install/arm//lib/libQtGui.so: undefined reference to `feof@GLIBC_2.0'
  2. /opt/EmbedSky/qt-4.5/__install/arm//lib/libQtGui.so: undefined reference to `mount@GLIBC_2.0'
  3. /opt/EmbedSky/qt-4.5/__install/arm//lib/libQtCore.so: undefined reference to `pthread_setschedparam@GLIBC_2.0'
  4. collect2: ld returned 1 exit status
  5. make: *** [hello_cn] 错误 1
复制代码



希望求解答。

现在我一直觉得setARM_env文件里面的有错。附上其内容
  1. #!/bin/sh

  2. export QPEDIR=/opt/EmbedSky/qt-4.5/__install/arm/bin
  3. export QTOPIA_DEPOT_PATH=/opt/EmbedSky/qt-4.5/__install/arm/bin
  4. export QTDIR=/opt/EmbedSky/qt-4.5/__install/arm/bin
  5. export DQTDIR=/opt/EmbedSky/qt-4.5/__install/arm/bin
  6. export QMAKE=/opt/EmbedSky/qt-4.5/__install/arm/bin/qmake
  7. export UIC=/opt/EmbedSky/qt-4.5/__install/arm/bin/uic
  8. export TMAKEDIR=/opt/EmbedSky/qt-4.5/__install/arm/bin
  9. export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
  10. export PATH=$QPEDIR/bin:$QTDIR/bin:$DQTDIR/bin:$TMAKEDIR/bin:$PATH
  11. export LD_LIBRARY_PATH=$QPEDIR/lib:$QTDIR/lib:$DQTDIR/lib:$LD_LIBRARY_PATH
复制代码

因为我查看这些变量的时候,有些变量值却没有。 如果是这个错了,能不能说说这个应该怎么改么?
我不清楚里面有什么地方出错了。

突然又想到一种情况:会不会是我编译qt4.5的时候用的arm-linux-gcc版本不对。

 楼主| 明何 发表于 2012-4-23 00:13:07 | 显示全部楼层
暂时找到一种解决方法,可惜晚上太迟了,板子不在身边。明天过去试试看。。。
解决方法暂时如下:
我在超级用户下查看自己arm-linux-gcc版本发现用的居然是3.4.5版本的,不是我一直认为的4.3.3版本的。所以估计编译的qt4.5的库版本也就存在问题了。所以重新使用4.3.3版本的编译了一次qt4.5,然后出来的程序版本就不再是2.4.3的了。
操作如下:
很久很久前就在/etc/profile下设置了PATH变量,但是一直没有生效,所以重新执行命令:
  1. source /etc/profile
复制代码
然后查看arm-linux-gcc版本:
  1. root@minghe-Inspiron-1420:/opt/EmbedSky/qt-4.5/pro/hello_cn# arm-linux-gcc -v

  2. Using built-in specs.
  3. Target: arm-none-linux-gnueabi
  4. Configured with: /scratch/maxim/arm-lite/src-4.3-arm-none-linux-gnueabi-lite/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-176' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/libc --with-gmp=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin
  5. Thread model: posix
  6. gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176)
复制代码
这次的版本问题是对的了,然后进如qt-4.5目录,删掉原来编译出来的程序文件。
重新编译
  1. root@minghe-Inspiron-1420:/opt/EmbedSky/qt-4.5# ./arm_qt4.5_build
复制代码
后面的步骤就和原来的一样了。最后看一下编译出来的hello_cn的信息
  1. root@minghe-Inspiron-1420:/opt/EmbedSky/qt-4.5/pro/hello_cn# file hello_cn
  2. hello_cn: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped
复制代码
今天只能暂时做到这里,有待明天去检验是不是整对了
 楼主| 明何 发表于 2012-4-23 12:11:59 | 显示全部楼层
:lol
果然是因为这个原因啊。。。 昨天晚上通过那样修改后得到的程序已经可以在ARM板子上正常运行了。。。
可惜可贺。花了一个月学习QT。花了半个月学ARM,总算现在可以在上面可以自由的开发一些自己需要的东西了。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-28 11:19 , Processed in 1.025325 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表