【问题标题】:Cannot compile Qt program for use on ARM device无法编译 Qt 程序以在 ARM 设备上使用
【发布时间】:2013-12-20 09:57:59
【问题描述】:

我想为 ARM 设备编译一个 Qt 程序。

我为 ARM 安装了工具链,我的 qmake.conf 文件如下所示:

#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabi-gcc
QMAKE_CXX               = arm-linux-gnueabi-g++
QMAKE_LINK              = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabi-g++
QMAKE_CFLAGS += -O3 -march=armv5te
QMAKE_CXXFLAGS += -O3 -march=armv5te
QMAKE_INCDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include
QMAKE_INCDIR_QT = /usr/share/qt4/include
QMAKE_LIBDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib


# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabi-objcopy
QMAKE_STRIP             = arm-linux-gnueabi-strip

load(qt_config)

问题是如果我包含(如上图):

QMAKE_INCDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include
QMAKE_INCDIR_QT = /usr/share/qt4/include
QMAKE_LIBDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib

我收到一条错误消息:

main.cpp:1:30: fatal error: QtGui/QApplication: No such file or directory

如果我排除:

QMAKE_INCDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include
QMAKE_LIBDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib

我收到一条错误消息:

/usr/include/qt4/QtCore/qatomic_x86_64.h:133:29: error: impossible constraint in ‘asm’

我是新手,这周已经挣扎了 40 多个小时,找不到问题所在。

我可以为 ARM 设备编译一个简单的 c++ 程序,但是当我尝试使用 Qt 时,我得到了上述错误,所以我认为问题是在 1 种情况下未加载 Qt 标头,而在另一种情况下使用了错误的从 c++ 到 asm 的转换器文件。

【问题讨论】:

  • 为什么不使用现有的规范? Qt 还没有支持某些特定的 ARM 吗?您是否在没有自定义 ARM 设置的情况下尝试过 qmake -spec linux-arm-gnueabi-g++
  • 感谢您的回复。这没什么太花哨的,但我发现我应该这样做编译,所以我就是这样做的。
  • 尝试放弃你的工作,并使用内置的 qmake mkspecs 支持。让我知道这次试验的结果。
  • 上面粘贴的 qmake.conf 来自qt4/mkspecs/qws/linux-arm-gnueabi-g++,我在其中添加了QMAKE_CFLAGS += -O3 -march=armv5te QMAKE_CXXFLAGS += -O3 -march=armv5te QMAKE_INCDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include QMAKE_INCDIR_QT = /usr/share/qt4/include QMAKE_LIBDIR_QT = /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,因为我很困惑为什么要使用 x86_64 标头。如果我删除上面的行并让它像安装时一样,我会得到/usr/include/qt4/QtCore/qatomic_x86_64.h:133:29: error: impossible constraint in ‘asm’
  • qws 不是我的建议。我是在建议非qws版本!请按照建议运行qmake -spec linux-arm-gnueabi-g++

标签: c++ qt arm cross-compiling


【解决方案1】:

仅阅读消息,qatomic_x86_64.h 在 ARM 版本中相当可疑。这显然是错误的工具链。所以,你肯定需要第一条语句来选择 ARM 工具链。

但是,我不确定为什么您修复缺失包含的方法是删除更多包含目录。我也不明白为什么当错误明显出现在 header 包含时,您会假设 Qt library 丢失。

据我所知,唯一的问题是QtGui\ 是一个相对路径,在任何QMAKE_INCDIR_QT 目录中都找不到。您的 QtGui 包含目录在哪里?

【讨论】:

  • 感谢您的回复。我的 QtGui 在 /usr/share/qt4/include
  • @NAlex :这可能是来自 x86_64 工具链的 QtGui。
  • 是的,可能,但我在 Qt 中找不到另一个包含目录。在 QtCore 目录中,我可以看到多个标题,例如:qatomic_arm.h、qatomic_i386.h、qatomic_x86_64.h 等。所以我认为它们都在那里,但 Qt 使用了错误的标题。
  • 这不是错误的工具链,而是工具链正在使用主机的包含路径。如果你完全编译它,它是运行时奇怪行为的一个秘诀。您需要将 --sysroot 选项添加到 GCC 以将编译器指向目标的头文件和库文件,而不是主机的。
  • 抱歉回复晚了,但我正在度假。请给我更多的细节好吗?到目前为止,我只使用命令行为我正在使用的机器进行编译,并没有交叉编译。
【解决方案2】:

我设法编译它,问题是我在安装 Qt Embedded 时使用了错误的 ./configure 选项。从头开始后,它没有问题地工作。

使用的选项: ./configure -opensource -confirm-license -no-pch -embedded arm -platform qws/linux-x86_64-g++ -xplatform linux-arm-gnueabi-g++ -little-endian -no-webkit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多