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

4
我在程序中有一些设置,这些设置依赖于我的编译目标的位宽。如果位宽为32位,则由于内存限制,必须定义一些特殊的宏。
找不到任何方法在qmake中检测目标的位宽,而在cmake中可以使用CMAKE_SIZEOF_VOID_P选项实现,其中8表示64位,4表示32位。
是否有类似于qmake的功能?

编辑: 根据评论请求的问题背景

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

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

第三部分: 该库在构建我的软件之前作为qmake中的自定义目标构建。一旦库被构建,我的软件将被构建并链接到该库。


为什么需要qmake或宏呢?只需使用常规的ifif constexpr或带有默认参数<bool x_32_bit = (4 == sizeof(void *))>的模板即可。 - user7860670
2
也许 contains(QMAKE_TARGET.arch, x86_64) 这个 qmake 语句可以给你正确的答案? - vahancho
很抱歉听起来有点无礼,但如果您需要在评论中告诉我们重要的细节,那么您并没有写一个好问题。请包括主机和目标平台、您尝试过什么以及尝试时发生了什么等细节。您在问题中提供的细节越多,我们就越少在评论中提问。 - Some programmer dude
我知道一些旧的历史混合系统,例如16/32位MC68000。在小型计算机的早期,"字长"和可寻址内存量之间的差距甚至更大。现在,在"大型机"系统中可能会找到类似的东西。那么,你真正想弄清楚什么?是"字"位宽吗?可寻址内存的数量(请记住,即使是32位x86系统也可以使用超过32位的虚拟内存)? - Some programmer dude
1
@Someprogrammerdude 我编辑了问题。希望这回答了你的问题。我基本上需要知道可寻址内存的数量,如果我的理解是正确的,那么32位系统仅限于4GB虚拟内存。 - The Quantum Physicist
显示剩余7条评论
3个回答

2

我最终采用了这个解决方案。首先,我添加了以下内容以支持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")
}

Learned this from here.


0

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

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

因此,当执行qmake时,您应该看到以下消息:

正在为64位机器构建...


我不能说这没有发生在我身上...只是太过于普遍了,我担心它可能涵盖了不想要的情况...你觉得呢? - The Quantum Physicist

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测试宏 - 如果您认为有必要,请在问题中展示相关代码。


如果是32位的话,我需要创建一个全局#define ABC。定义必须在makefile中完成,因为库需要作为我的构建系统的一部分进行构建。如果这不能回答你的问题,请解释你需要什么信息。 - The Quantum Physicist
唯一使用define的消费者是库代码,可能是C或C++编写的,那么如何使用该define来避免上述解决方案? - Kuba hasn't forgotten Monica
我的qmake文件将库构建为目标,然后在构建完成后将库输出链接到我的程序。我不知道你提供的代码如何实现这一点。如果可以,请解释一下如何实现。 - The Quantum Physicist
我在问题中添加了更多信息,说明了它作为自定义目标在qmake中的外观。 - The Quantum Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接