如何为Apple M1及Intel设备编译FFTW并解决Xcode架构缺失报错
问题根因
你将Xcode构建目标版本设置为10.11,该版本早于Apple Silicon的首发版本macOS 11,因此Xcode会默认生成同时兼容Intel x86_64和ARM64架构的通用二进制包,而你在M1上原生编译的FFTW库仅包含ARM64架构切片,因此链接时会提示缺失x86_64架构。
解决方案1:交叉编译合并为通用库(无需Intel设备)
不需要专门使用Intel设备编译,你可以直接在M1设备上交叉编译出x86_64版本的FFTW,再合并为通用库即可,操作步骤如下:
- 编译x86_64版本FFTW
执行configure时指定x86_64架构参数:
编译完成后可在./configure --host=x86_64-apple-darwin CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LDFLAGS="-arch x86_64" --prefix=./fftw-x86_64 make -j8 && make install./fftw-x86_64/lib路径下获得x86_64架构的libfftw3.a文件。 - 编译ARM64版本FFTW
你之前已编译好的ARM64版本可直接使用,若需重新编译可使用以下参数:./configure --host=arm64-apple-darwin CFLAGS="-arch arm64" CXXFLAGS="-arch arm64" LDFLAGS="-arch arm64" --prefix=./fftw-arm64 make -j8 && make install - 合并为通用库
使用lipo工具合并两个架构的库文件:
执行lipo -create ./fftw-x86_64/lib/libfftw3.a ./fftw-arm64/lib/libfftw3.a -output libfftw3.alipo -info libfftw3.a验证,返回结果将显示同时包含x86_64和arm64架构,导入Xcode即可正常链接。
解决方案2:调整Xcode构建设置(适用无需兼容旧Intel设备场景)
如果你的应用不需要支持macOS 11以下的Intel设备用户,可直接修改Xcode架构配置跳过x86_64构建:
- 将
Architectures设置项修改为仅保留arm64 - 将
Build Active Architecture Only的Release配置改为Yes
修改后Xcode将仅构建ARM64架构的安装包,无需使用x86_64版本的FFTW库。
更规范的方案:使用包管理工具自动处理
可直接通过Homebrew安装FFTW,Apple Silicon设备上的Homebrew默认提供双架构通用版本的FFTW库,执行brew install fftw后,直接导入Homebrew安装路径下的libfftw3.a即可,无需手动编译和合并架构。
内容的提问来源于stack exchange,提问作者Thinium
相关产品推荐
相关产品推荐

