以 1 的结构成员对齐方式编译 Qt

Posted

技术标签:

【中文标题】以 1 的结构成员对齐方式编译 Qt【英文标题】:Compiling Qt with a struct member alignment of 1 【发布时间】:2013-05-26 18:19:23 【问题描述】:

问题

我有一个在 Visual Studio 2005 中制作的 Qt 应用程序,它使用了相当数量的其他库,这些库都是以 1 的结构成员对齐方式编译的。我也很确定 Qt 默认使用的结构成员对齐方式为0.

当我使用结构成员对齐为 0(其他库将失败)或 1(Qt 将失败)编译我的应用程序时,这显然会导致问题。

我尝试过的

projects.pro 文件中的编译器标志

    我下载了Qt的源代码。

    我在 projects.pro 文件的顶部添加了以下内容

    QMAKE_CXXFLAGS_DEBUG += -Zp1 QMAKE_CXXFLAGS_RELEASE += -Zp1

    我使用 Visual Studio 命令行启动了 configure.exe,它创建了 makefile。

    我启动了 nmake,然后编译 Qt。

这会导致 Qt 以 0 的结构成员对齐方式进行编译。也许编译器无法识别 -Zp1(我也尝试过 /Zp1),但这会让我感到惊讶,因为这是 Visual Studio 在其属性页中使用它的方式:

makefile 中的编译器标志

现在正在考虑做同样的事情:

    下载Qt源代码。 在 Visual Studio 命令行中运行 configure.exe。

此时我有了可以更改的 makefile,以便它可以使用 1 的结构成员对齐。这里没有成功。

我的问题

如何编译 Qt for Visual Studio 2005,结构成员对齐为 1?

【问题讨论】:

【参考方案1】:

Qt 不支持不同于 8(默认)的结构成员对齐。解决这个问题的唯一方法是使用#pragma pack:

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

包围所有 Qt 代码并包含一个推送和弹出:

#pragma pack(push, 8)
...
#pragma pack(pop)

【讨论】:

以上是关于以 1 的结构成员对齐方式编译 Qt的主要内容,如果未能解决你的问题,请参考以下文章

指定字节对齐方式

Visual Studio2008 C++结构体成员需要内存对齐吗?

结构体内存的对齐方式

字节对齐方法

结构体对齐计算方式

零基础入门之结构体字节对齐