在AMD64主机编译ARM64版OpenCV时遇Error C1189问题求助
在Windows x64主机交叉编译ARM64版本OpenCV时遇到C1189错误的解决方法
问题概述
在Windows x64(AMD64)主机上使用Visual Studio 2022编译ARM64版本OpenCV 4.5.4时,反复触发以下错误:
fatal error C1189: #error: This header is specific to X86, X64, ARM64, and ARM64EC targets
根源是预处理器未正确定义_M_ARM64宏,尽管已经通过vsdevcmd -arch=arm64 -host_arch=amd64配置环境,且CMake指定了-A ARM64参数。
问题分析
从CMake输出的-- Detected processor: AMD64可以看出,CMake可能误判了目标架构;同时编译过程中部分环节未正确传递ARM64编译参数,导致编译器未自动注入_M_ARM64宏。手动设置CL变量的尝试未生效,大概率是因为CMake生成工程时覆盖了相关配置。
解决步骤
1. 确保VS开发环境完全生效
- 关闭所有终端窗口,重新打开管理员权限的终端,执行:
vsdevcmd -arch=arm64 -host_arch=amd64 -no_logo - 验证环境变量:执行
echo %CL%,确认输出包含/D_M_ARM64=1;如果没有,手动补充:set CL=/D_M_ARM64=1 %CL%
2. 修正CMake参数格式
原脚本中CMAKE_GENERATOR_OPTIONS的引号格式存在问题,导致CMake无法正确解析生成器选项,修改变量设置如下:
set "CMAKE_GENERATOR_OPTIONS=-G "Visual Studio 17 2022"" set "CMAKE_ARCHITECTURE=-A ARM64" set "CMAKE_OPTIONS=-DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_CUDA:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DINSTALL_CREATE_DISTRIB=ON -DBUILD_opencv_java=OFF -DBUILD_opencv_python=OFF -DBUILD_PROTOBUF=OFF -DBUILD_opencv_dnn=OFF"
3. 强制指定ARM64编译器
在CMake命令中显式指定C/CXX编译器路径,避免CMake误选x64版本:
cmake .. %CMAKE_GENERATOR_OPTIONS% %CMAKE_ARCHITECTURE% %CMAKE_OPTIONS% ^ -DCMAKE_C_COMPILER="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.37.32822/bin/Hostx64/arm64/cl.exe" ^ -DCMAKE_CXX_COMPILER="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.37.32822/bin/Hostx64/arm64/cl.exe"
注意替换路径为你实际的VS版本对应的编译器路径。
4. 强制注入_M_ARM64宏
在CMake选项中添加编译参数,强制注入目标架构宏:
set "CMAKE_OPTIONS=-DBUILD_PERF_TESTS:BOOL=OFF ... -DCMAKE_CXX_FLAGS="/D_M_ARM64=1" -DCMAKE_C_FLAGS="/D_M_ARM64=1""
5. 清理残留配置后重新构建
彻底清理旧build目录,避免残留配置干扰:
rmdir /s /q opencv-4.5.4\build mkdir opencv-4.5.4\build cd opencv-4.5.4\build
重新执行CMake生成和编译命令。
验证
重新编译后,检查CMake输出是否包含目标架构为ARM64的提示,且编译过程中不再出现_M_ARM64未定义的错误。
内容的提问来源于stack exchange,提问作者SiloSampsa
相关产品推荐
相关产品推荐

