簡體   English   中英

qmake:檢測目標位寬(32位或64位)

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

我的程序中的設置取決於編譯目標的位寬。 在寬度為32位的情況下,由於存儲器限制,必須定義一些特殊的宏。

在qmake中找不到任何方法來檢測目標的位寬,而cmake中的相同選項可用: CMAKE_SIZEOF_VOID_P ; 其中8是64位,4是32位。

qmake有類似的東西嗎?


編輯:評論中要求的問題背景

第1部分 :我在C ++ 11程序中使用的C庫需要宏在32位系統上采取不同的行為。

第2部分:在32位系統中,內存限制為4 GB的虛擬內存 即使您運行的是64位系統和計算機,即使您有500 GB的交換內存,32位程序也不能使用超過4 GB的內存。 這就是為什么我正在使用的庫具有32位的特殊設置,以限制它使用的內存量。 因此,我需要知道我們是否正在編譯32位目標(例如,Raspberry Pi),以激活所需的宏。

第3部分:在構建我的軟件之前,庫是作為qmake中的自定義目標構建的。 構建庫后,我的軟件就構建完成並鏈接到該庫。

我最終使用了這個解決方案。 首先我添加了這個來支持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")
}

這里學到了這一點

你可以添加.pro文件之類的東西

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

所以當執行qmake時,你應該看到msg

為64位機器構建...

您應該能夠將宏與編譯時常量(但不是預處理器常量)結合使用來進行設置:

#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測試宏 - 如果您認為存在,則需要在您的問題中顯示主題代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM