无法在C头文件中定义matrix_double3x3的技术问题求助
问题详情
我在C头文件里定义matrix_double3x3属性时编译器不让过,但matrix_float3x3或者matrix_half3x3能正常定义。翻了matrix_types.h文件,里面明明有typedef simd_double3x3 matrix_double3x3的定义,我要把这个矩阵传入Metal里做图像校正计算。
环境信息
- Xcode 14.0 (14A309)
- 目标平台:macOS(最低部署版本12.3)
- macOS 12.6 (21G115)
解决建议
先查框架引入和编译开关
确保你的C代码所在的编译目标已经引入了simd框架,毕竟matrix_double3x3是基于simd_double3x3的类型定义。另外去Xcode的编译设置里找到Enable SIMD Double Precision选项,把它打开(对应的编译标志是-fsimd-double),macOS 12.3及以上支持这个特性,但默认可能没开启。核对头文件引入顺序
要在引用matrix_double3x3之前,正确引入<simd/simd.h>或者<Metal/Metal.h>(Metal头文件会自动带simd的相关定义),别因为头文件引晚了导致类型没被解析到。如果是纯C文件,直接引<simd/simd.h>更稳妥,能确保所有simd类型都加载完整。Metal端类型要匹配
在Metal着色器里,得用double3x3类型来接收数据,CPU端的matrix_double3x3对应Metal端的double3x3,必须严格匹配,不然传数据会出问题。传递的时候用MTLBuffer或者MTLArgumentEncoder来封装矩阵,保证内存布局和Metal端一致。清理缓存或换Xcode版本试试
Xcode 14.0对simd双精度类型的支持可能有小bug,先试试清理编译缓存(点Product -> Clean Build Folder)再重新编译,要是还不行,临时升级到Xcode 14.1及以上版本看看是不是版本兼容性问题。
内容的提问来源于stack exchange,提问作者Chat Dp

