3

I have a 32bit and a 64bit version of my application and need to do something special in case it's the 32bit version running on 64bit Windows. I'd like to avoid platform specific calls and instead use Qt or boost. For Qt I found Q_PROCESSOR_X86_32 besides Q_OS_WIN64 and it seems this is exactly what I need. But it doesn't work:

#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

This puts out nothing when running the 32 bit App on my 64 bit Windows 7. Do I misunderstand the documentation of these global declarations?

Since there's some confusion: This is not about detecting the OS the app is currently running on, it's about detecting the "bitness" of the app itself.

4

5 回答 5

4

看一下:在 64 位主机上运行时,QSysInfo::currentCpuArchitecture()它将返回一个包含其中的字符串。"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 位代码的架构。

于 2016-04-15T14:34:27.400 回答
3

您可以使用Q_PROCESSOR_WORDSIZE(或此处)。我很惊讶它没有记录,因为它不在私有标头(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);
}
于 2018-11-29T15:27:15.417 回答
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 的。没有可移植的方式来做到这一点,在Linux上,您可以使用 runsystem("getconf LONG_BIT")system("uname -m")检查其输出。

于 2016-04-15T14:17:41.907 回答
1

您可以使用 GetNativeSystemInfo(见下文)来确定操作系统的版本。正如其他已经提到的,应用程序的版本是在编译时确定的。

_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
}
于 2017-01-26T00:10:37.040 回答
0

正确的名称是Q_PROCESSOR_X86_32Q_PROCESSOR_X86_64

但是,如果发生这种情况,您的应用程序将来会在 ARM 上运行,这将无法正常工作。而是考虑检查sizeof(void *)QT_POINTER_SIZE例如。

另外请注意,在 Windows 上,GUI 应用程序通常无法输出到标准输出,因此它可以工作但不显示任何内容。改为使用eithrr 调试器或消息框或输出到某个虚拟文件。

于 2016-04-15T14:13:02.460 回答