手臂上的qt3:无法绑定填充字段

时间:2018-01-16 09:41:04

标签: c++ linux arm raspberry-pi2 qt3

我正在使用qt3的软件。它工作正常un 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。

这是我的环境:

  • CPU:ARMv7
  • 操作系统:Ubuntu 16.04
  • 编译器:gcc / g ++ 4.8.5(Ubuntu / Linaro 4.8.5-4ubuntu2)
  • Qt版本:来自here的3.3.8b(尝试使用x11和嵌入式)

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

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

1 个答案:

答案 0 :(得分:0)

这个错误很奇怪。我发现的解决方案甚至更奇怪。

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

从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头文件有任何问题,也可能是这些差异。