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 那里学到的。
我的程序中有一些设置取决于我编译的目标的位宽。如果宽度是 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 那里学到的。