You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

M1 MacBook Air上如何将C代码编译为x86_64汇编?

问题描述

在M1 MacBook Air上,尝试用Clang将依赖标准库(如stdio.h)的C代码编译为x86_64架构的Intel风格汇编代码时,遇到头文件找不到的错误。无库依赖的代码可以正常编译:

clang -target x86_64 -masm=intel -S add_two_numbers.c

但编译带stdio.h的代码时失败:

❯ clang -target x86_64 -masm=intel -S hello.c
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~

手动指定库路径的方式过于繁琐,需要更简便的解决方案。

解决方案

方法1:通过Rosetta运行x86_64版本的Clang

  1. 右键终端应用,选择「获取信息」
  2. 勾选「使用Rosetta打开」,重启终端
  3. 在这个x86_64环境的终端中,直接执行编译命令即可:
clang -masm=intel -S hello.c

此时Clang默认使用x86_64的系统头文件和库,无需额外指定target参数。

方法2:指定完整的target triple(无需Rosetta)

在arm64终端中,明确指定x86_64架构的macOS target,Clang会自动定位到对应的系统库:

# 替换为你的macOS版本,比如13.5
clang -target x86_64-apple-macos13.5 -masm=intel -S hello.c

可以用sw_vers -productVersion命令快速获取当前macOS版本,写成动态命令:

clang -target x86_64-apple-macos$(sw_vers -productVersion) -masm=intel -S hello.c

方法3:使用xcrun指定SDK

通过xcrun调用Clang并绑定macOS SDK,确保正确找到x86_64的库文件:

xcrun -sdk macosx clang -target x86_64-apple-macos$(sw_vers -productVersion) -masm=intel -S hello.c
原理说明

M1 MacBook Air默认使用arm64架构的工具链,仅指定-target x86_64时,Clang无法确定要使用的平台库(比如是Linux还是macOS),因此找不到对应的标准头文件。指定完整的target triple(如x86_64-apple-macosX.X)或切换到x86_64环境(Rosetta),能让Clang正确加载x86_64版本的系统标准库和头文件。

内容的提问来源于stack exchange,提问作者Tirtharaj Pramanik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:19