qmake:检测目标位宽(32 位或 64 位)

qmake: detect target bit-width (32-bit or 64-bit)

我的程序中有一些设置取决于我编译的目标的位宽。如果宽度是 32 位,由于内存限制,必须定义一些特殊的宏。

could not find any way in qmake to detect the bit-width of the target, while the same option is available in cmake with: CMAKE_SIZEOF_VOID_P;其中 8 是 64 位,4 是 32 位。

qmake 有类似的东西吗?


编辑:评论中要求的问题背景

第 1 部分:我在我的 C++11 程序中使用了一个 C 库,它需要一个宏才能在 32 位系统上以不同方式运行。

第 2 部分: 在 32 位系统中,内存限制为 4 GB virtual memory。即使您是 运行 64 位系统和机器,即使您有 500 GB 的交换内存,32 位程序也不能使用超过 4 GB。这就是为什么我正在使用的库具有针对 32 位的特殊设置,以限制它使用的内存量。因此,我需要知道我们是否正在针对 32 位目标(例如,Raspberry Pi)进行编译,以激活所需的宏。

第 3 部分: 在构建我的软件之前构建库 as a custom target in qmake。一旦构建了库,我的软件就构建完成并链接到该库。

您可以在 .pro 文件中添加类似

的内容
*-64
{
    message( "Building for 64 bit machine...")
}

所以当执行 qmake 时,你应该看到 msg

Building for 64 bit machine...

您应该能够将宏与编译时常量(但不是预处理器常量)结合使用来进行设置:

#define TARGET_64 (sizeof(void*) == 8)
#define TARGET_32 (sizeof(void*) == 4)

然后,例如更改分配的内存量:

char buffer1[TARGET_32 ? 0x10000000 : 0x40000000];
char *buffer2;

void foo(void) {
  buffer2 = malloc(TARGET_32 ? 0x10000000 : 0x40000000);
}

可能不需要使用 #ifdef 测试宏 - 如果您认为有,则需要在问题中显示主题代码。

我最终使用了这个解决方案。首先我添加这个来支持 linux:

linux-g++:QMAKE_TARGET.arch = $$QMAKE_HOST.arch
linux-g++-32:QMAKE_TARGET.arch = x86
linux-g++-64:QMAKE_TARGET.arch = x86_64

然后是这个:

contains(QMAKE_TARGET.arch, x86_64) {
    message("Compiling for a 64-bit system")
} else {
    DEFINES += ABC
    message("Compiling for a 32-bit system")
}

这是从 here 那里学到的。