【问题标题】:qmake: detect target bit-width (32-bit or 64-bit)qmake:检测目标位宽(32 位或 64 位)
【发布时间】:2019-03-28 17:26:21
【问题描述】:

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

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

qmake 有类似的东西吗?


编辑: cmets 中要求的问题背景

第 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。构建库后,我的软件将构建并链接到该库。

【问题讨论】:

  • 相关并不意味着因果关系...仅仅因为 void* 恰好是 48 并不意味着您使用的是 32 位或 64 位系统。它通常是这样的,但它没有在任何地方指定或标准化。
  • @Someprogrammerdude 我不是在寻找它是 32 位还是 64 位 系统。我正在寻找 目标 是 32 位还是 64 位。这是一个与虚拟内存有关的问题,在 32 位目标中限制为 4 GB。
  • 主机或目标无所谓,你仍然不能使用指针的宽度而不是hint来猜测。
  • 也许contains(QMAKE_TARGET.arch, x86_64) qmake 语句会给你正确的答案?
  • @Someprogrammerdude 我编辑了这个问题。我希望这能回答你的问题。我基本上需要知道可寻址内存的数量,如果我的理解是正确的,那么 32 位系统限制为 4 GB 虚拟内存。

标签: c++ qt architecture qt5 qmake


【解决方案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 那里学到的。

【讨论】:

    【解决方案2】:

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

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

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

    为 64 位机器构建...

    【讨论】:

    • 我不能说这没有发生在我身上......它太笼统了,我担心它可能会涵盖不需要的情况......你不觉得吗?
    【解决方案3】:

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

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

    【讨论】:

    • 如果是 32 位的,我需要创建一个全局的 #define ABC。该定义必须在 makefile 中完成,因为该库需要作为我的构建系统的一部分进行构建。如果这不能回答您的问题,请说明您需要哪些信息。
    • 好吧,define 的唯一消费者是库代码,大概是 C 或 C++,那么你如何消费排除上述解决方案的定义?
    • 我的 qmake 文件将库构建为目标,然后在构建后将库结果链接到我的程序。我看不出如何使用您提供的代码来完成此操作。如果可以,请说明方法。
    • 我在问题中添加了更多信息,说明它在 qmake 中的外观如何作为自定义目标。
    猜你喜欢
    • 2011-12-15
    • 2011-10-24
    • 1970-01-01
    • 2012-10-26
    • 2017-08-04
    • 1970-01-01
    • 2010-12-17
    • 2019-01-07
    相关资源
    最近更新 更多