M1 Mac使用Clang 13编译时架构不匹配错误的原因及解决方法
问题分析与解决方案
环境信息
GCC版本验证
执行gcc --version得到:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang version 13.0.0 (clang-1300.0.29.30) Target: arm64-apple-darwin21.5.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Ranlib工具信息
验证ranlib版本时:
% ranlib --version error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: unknown option character `-' in: --version Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib [-sactfqLT] [-] archive [...] (base) user@user BUILD_DIR % ranlib -version error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: unknown option character `v' in: -version Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib [-sactfqLT] [-] archive [...]
PATH环境变量
执行echo $PATH输出:
% echo $PATH /usr/bin:/Users/username/opt/anaconda3/bin:/Users/username/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
完整环境变量(env输出)
% env TERM_PROGRAM=Apple_Terminal SHELL=/bin/zsh TERM=xterm-256color TMPDIR=/var/folders/9x/gdg5j9sd4wx3q_v9f2pkrw6r0000gn/T/ TERM_PROGRAM_VERSION=445 TERM_SESSION_ID=C5417ED9-E4C8-411C-9CC3-18711A679E88 USER=username SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.nCSXSuYzna/Listeners PATH=/usr/bin:/Users/username/opt/anaconda3/bin:/Users/username/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
构建错误信息
执行configure后用make构建项目时,出现如下链接错误:
ld: warning: ignoring file /usr/local/Cellar/gcc/11.3.0_2/lib/gcc/11/libquadmath.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64 ld: in '/usr/local/Cellar/gcc/11.3.0_2/lib/gcc/11/libquadmath.0.dylib', building for macOS-x86_64 but attempting to link with file built for macOS-arm64 collect2: error: ld returned 1 exit status make[8]: *** [libfgsl.la] Error 1 make[7]: *** [subdir-fgsl] Error 2 make[6]: *** [build-fgsl] Error 2 make[5]: *** [hd-std-all-subdirs] Error 2 make[4]: *** [all-subdirs] Error 2 make[3]: *** [hd-std-all] Error 2 make[2]: *** [all] Error 2 make[1]: *** [heacore] Error 2 make: *** [all] Error 2
已尝试操作
- 更新CMake
- 尝试修改
CMAKE_OSX_ARCHITECTURES配置项,但未在cmake中找到该选项
错误原因分析
- 架构不匹配:当前构建目标是macOS-x86_64(Intel架构),但链接的
libquadmath.dylib是为macOS-arm64(M系列芯片)编译的,导致链接器拒绝兼容。 - 工具链混淆:系统默认的
gcc实际是Apple Clang(arm64版本),但/usr/local/Cellar下的GCC是arm64版本,而构建过程可能强制使用了x86_64架构编译,引发交叉链接冲突。 - Anaconda环境干扰:PATH中Anaconda目录优先级靠前,可能引入了x86_64版本的依赖或工具,导致构建过程自动切换到Intel架构。
修复方案
方案1:统一构建架构为arm64
在执行configure前,设置环境变量强制使用arm64架构:
export ARCHFLAGS="-arch arm64" export CC="/usr/bin/clang" export CXX="/usr/bin/clang++"
然后重新执行构建流程:
./configure make clean && make
方案2:移除冲突的arm64版本GCC
如果不需要Homebrew安装的GCC,直接卸载:
brew uninstall gcc@11
卸载后重新执行构建,让系统使用默认的Apple Clang工具链。
方案3:调整PATH优先级,避免工具链混淆
修改PATH,让系统默认工具链优先于Anaconda和Homebrew目录:
export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/username/opt/anaconda3/bin:/Users/username/opt/anaconda3/condabin:/opt/X11/bin:/Library/Apple/usr/bin"
重启终端后重新执行构建命令。
方案4:使用Rosetta 2运行终端(适配x86_64架构)
如果项目必须用x86_64架构编译:
- 找到“终端”应用,右键选择“显示简介”
- 勾选“使用Rosetta打开”
- 重启终端,重新执行
configure和make,此时会自动使用x86_64版本的工具链,避免与arm64库冲突。
内容的提问来源于stack exchange,提问作者Py-ser
相关产品推荐
相关产品推荐

