在使用MXE进行交叉编译时,如何可靠地检测原生的Windows构建?
我正在用MXE构建 Alembic ,并使用 MXE,主机是Linux(在Windows的 WSL上运行的Ubuntu),目标平台是Windows。
#if defined _WIN32
#include <Windows.h>
#endif
在Windows上原生编译时,一切都能正常工作。然而,在使用MXE进行跨编译时,_WIN32 和 _WIN64 即使主机是Linux也被定义了,因此 <Windows.h> 不存在,构建会失败。删除这些 #if 的检查及其内容后,构建就能成功。
我最初查看了这个StackOverflow的答案:Is there a compiler macro to detect Windows?,它建议使用 _WIN32。但在MXE的跨编译中,_WIN32 并不可靠,因为它只表示一个Windows目标,而非本地Windows主机。
问题:
是否存在一个预处理宏、CMake变量,或其他方法,能够可靠地区分“原生Windows构建”和跨编译目标?
这将使像Alembic这样的项目仅在实际可用Windows头文件时才包含它们,从而避免跨编译失败。有关更多背景,请看我遇到的这个具体问题:here's the specific issue。
解决方案
#if defined _WIN32 是正确的检查。它在跨编译到Windows时应该为真,这里没有问题。如果 windows.h 找不到,你应该修复它,而不是回避这个头文件。
你的问题很可能是因为在包含时把 Windows.h 拼写成了 windows.h。这只在跨编译时才重要,因为在Windows上文件名不区分大小写,但在Linux上会区分。MinGW把这个文件名写成小写,因此任何为了跨编译友好而编写的代码也需要把它拼写成小写。
或者,你可以找到你的 windows.h,再创建一个名为 Windows.h 的副本,如果你不想直接修改代码的话。