0

我正在使用使用 qt3 的软件。它在 x86-linux 系统上运行良好。当我尝试将它移植到 Raspberry Pi 2 时,我遇到了一个奇怪的编译器错误。谷歌无法帮助我,我尝试的一切都失败了。

错误是:

无法将打包字段 '((QChar*)this)->QChar::ucs' 绑定到 'ushort&{aka short unsigned int&}'

这是指 qstring.h 的以下部分

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *(&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

当然,我已经尝试定义Q_NO_PACKED_REFERENCE哪个只是将错误移动到上面的行。我还尝试明确定义架构、浮动 abi 和 cpu。

这是我的环境:

  • 处理器:ARMv7
  • 操作系统:Ubuntu 16.04
  • 编译器:gcc/g++ 4.8.5 (Ubuntu/Linaro 4.8.5-4ubuntu2)
  • Qt 版本:3.3.8b from here(尝试使用 x11 并嵌入)

如果您想知道我为什么使用 qt3 和旧的 gcc,那是因为我们希望保持我们的源代码与我们使用的一些旧系统兼容。

我的问题是: 此错误的原因是什么,我该如何解决?(最好在不更改 qt3 头文件的情况下进行修复。)

4

1 回答 1

0

这个错误很奇怪。我找到的解决方案更奇怪。

似乎来自 https://download.qt.io/archive/qt/3/ 的 qt3 安装包含与来自https://launchpad.net/ubuntu/precise/armhfdebian 包不同的头文件。

从 debian 包安装 qt3 而不是从 qt 页面编译源代码后,我的代码编译得很好。

我查看了两个头文件,导致错误的行现在包含一个额外的演员表。

来自 qt.io

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *(&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

从启动板

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *((ushort*)&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

两组标题之间似乎存在更多差异。如果其他人对 qt 头文件有任何问题,也可能是这些差异。

于 2018-01-16T10:23:18.293 回答