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

时间:2018-10-24 10:24:10

标签: c++ qt architecture qt5 qmake

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

could not find any way in qmake检测目标的位宽,而在cmake中可以使用以下相同的选项:CMAKE_SIZEOF_VOID_P;其中8是64位,而4是32位。

qmake是否有类似的东西?


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

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

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

第3部分::库as a custom target in qmake是在构建软件之前构建的。构建库之后,便会构建我的软件并将其链接到该库。

3 个答案:

答案 0 :(得分:1)

我最终使用了该解决方案。首先,我添加了此代码以支持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那里学到了这一点。

答案 1 :(得分:0)

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

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

所以当执行qmake时,您应该看到味精

  

正在为64位计算机构建...

答案 2 :(得分:0)

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

#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测试宏-如果您认为有宏,则需要在问题中显示主题代码。