我有一个32位和64位版本的应用程序,需要做一些特殊的事情,因为它是在64位Windows上运行的32位版本。我想避免使用特定于平台的呼叫,而是使用Qt或boost。对于Qt,除了Q_PROCESSOR_X86_32之外,我发现了Q_OS_WIN64,这似乎正是我所需要的。但它不起作用:
#include <QtGlobal>
#ifdef Q_PROCESSOR_X86_64
std::cout << "64 Bit App" << std::endl;
#endif
#ifdef Q_PROCESSOR_X86_32
std::cout << "32 Bit App" << std::endl;
#endif
在我的64位Windows 7上运行32位应用程序时,这没有任何结果。我是否误解了这些全局声明的文档?
由于存在一些混淆:这不是关于检测应用当前正在运行的操作系统,而是关于检测&#34; bitness&#34;应用程序本身。
答案 0 :(得分:4)
查看QSysInfo::currentCpuArchitecture()
:当在64位主机上运行时,它将返回包含"64"
的字符串。类似地,QSysInfo::buildCpuArchitecture()
将在64位主机上编译时返回此字符串:
bool isHost64Bit() {
static bool h = QSysInfo::currentCpuArchitecture().contains(QLatin1String("64"));
return h;
}
bool isBuild64Bit() {
static bool b = QSysInfo::buildCpuArchitecture().contains(QLatin1String("64"));
return b;
}
然后,您要检测的条件是:
bool is32BuildOn64Host() { return !isBuild64Bit() && isHost64Bit(); }
这应该可以移植到支持在64位主机上运行32位代码的所有体系结构。
答案 1 :(得分:1)
正确的名称是Q_PROCESSOR_X86_32
或Q_PROCESSOR_X86_64
。
但是,如果您的应用程序在将来运行在ARM上,则无法运行。相反,请考虑检查sizeof(void *)
或QT_POINTER_SIZE
。
另外请注意,在Windows上,GUI应用程序通常无法输出到stdout,因此它可能有效但不显示任何内容。使用eithrr调试器或消息框或输出到某个虚拟文件。
答案 2 :(得分:1)
预处理程序指令在编译时进行评估。你想要做的是编译32位并在运行时检查你是否在64位系统上运行(注意你的进程将是32位):
#ifdef Q_PROCESSOR_X86_32
std::cout << "32 Bit App" << std::endl;
BOOL bIsWow64 = FALSE;
if (IsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64)
std::cout << "Running on 64 Bit OS" << std::endl;
#endif
该示例为Windows specific。没有一种可移植的方式,Linux您可以 使用运行system("getconf LONG_BIT")
或system("uname -m")
并检查其输出。
答案 3 :(得分:1)
您可以使用GetNativeSystemInfo(见下文)来确定操作系统的版本。正如其他已经提到的,App的版本是在编译时确定的。
_SYSTEM_INFO sysinfo;
GetNativeSystemInfo(&sysinfo);
if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
{
//this is a 32-bit OS
}
if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
//this is a 64-bit OS
}
答案 4 :(得分:0)
您可以使用Q_PROCESSOR_WORDSIZE(或here)。我很惊讶它没有记录,因为它不在私有标头(QtGlobal)中,并且非常方便。
在某些用例中,它可能更可取,因为它不依赖于处理器体系结构。 (例如,对于x86_64以及arm64等,它的定义方式相同)
示例:
#include <QtGlobal>
#include <QDebug>
int main() {
#if Q_PROCESSOR_WORDSIZE == 4
qDebug() << "32-bit executable";
#elif Q_PROCESSOR_WORDSIZE == 8
qDebug() << "64-bit executable";
#else
qDebug() << "Processor with unexpected word size";
#endif
}
甚至更好:
int main() {
qDebug() << QStringLiteral("%1-bit executable").arg(Q_PROCESSOR_WORDSIZE * 8);
}