32位MinGW g++提示找不到GetLogicalProcessorInformationEx如何解决?
问题产生原因
你遇到的链接错误是32位MinGW-W64 7.3.0版本的固有缺陷导致,和Clang本身无关:GetLogicalProcessorInformationEx是Windows 7(对应_WIN32_WINNT 0x0601)及以上系统提供的原生API,你使用的32位MinGW-W64 7.3.0版本的kernel32导入库没有正确导出该API的32位符号,哪怕你已经按照Windows文档要求定义了_WIN32_WINNT宏,链接器也无法找到对应的函数实现,因此会报undefined reference错误。
修复方案
有两种可行方案:
- 方案一:升级32位MinGW-W64到8.1.0及以上版本,新版本已经修复了该API符号缺失的问题,你实测升级后问题解决就是这个方案的验证结果。
- 方案二:如果暂时无法升级MinGW版本,可以通过动态加载API的方式规避静态链接的符号缺失问题,修改后的测试代码如下:
#define _WIN32_WINNT 0x0601 #include <windows.h> #include <stdio.h> // 声明API对应的函数指针类型 typedef BOOL (WINAPI *LPFN_GETLOGICALPROCESSORINFORMATIONEX)( LOGICAL_PROCESSOR_RELATIONSHIP Relationship, PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, PDWORD BufferLength ); int main() { SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer[10]; DWORD Len = sizeof(Buffer); // 从系统自带的kernel32.dll中动态获取API地址 HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); LPFN_GETLOGICALPROCESSORINFORMATIONEX pfnApi = (LPFN_GETLOGICALPROCESSORINFORMATIONEX)GetProcAddress(hKernel32, "GetLogicalProcessorInformationEx"); if (pfnApi) { pfnApi(RelationProcessorCore, Buffer, &Len); // 此处补充你的业务逻辑 } else { printf("当前系统版本过低,不支持该API\n"); return 1; } return 0; }
修改后直接使用原指令g++ test.cpp即可正常编译链接。
内容的提问来源于stack exchange,提问作者TonyK
相关产品推荐
相关产品推荐

