Mac M1下VSCode通过Makefile调试多文件C程序配置问题
先理清几个工具的区别,避免走弯路
- M1 Mac终端里输入
gcc不会调用原版GNU GCC,只是Apple Clang的软链接,你跑gcc -v输出Apple clang 13.1.6就是这个原因,它是苹果适配arm64架构的C编译器,和GCC命令参数基本兼容,新手直接用就行,不用额外装别的编译器。 gdb是GNU生态的调试器,lldb是LLVM生态配套Clang的调试器。Apple Clang编译出的程序原生适配lldb,M1上装gdb需要手动做代码签名、调整系统安全设置的一堆操作,新手完全没必要折腾,直接用lldb就够。- VSCode官方C/C++扩展在Mac上默认就支持lldb调试,不需要额外配置调试器后端。
多文件项目+Makefile调试的正确配置(适配M1 arm64)
第一步:先把Makefile改对,确保编译出带调试信息的可执行文件
所有编译、链接步骤必须加-g参数生成调试符号,调试阶段别开-O2/-O3优化(会导致断点漂移、变量被优化看不到),也别加-s参数(会剥离符号表),编译参数直接用-g -O0 -Wall -arch arm64最稳妥。
给你一个可以直接用的多文件Makefile模板,把里面的源文件、目标文件名换成你自己的就行:
CC = clang CFLAGS = -g -O0 -Wall -arch arm64 TARGET = your_app_name # 替换成你的可执行文件名 SRCS = main.c util.c foo.c # 替换成你项目里所有.c文件的相对路径 OBJS = $(SRCS:.c=.o) all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $^ # 自动编译所有.c文件为.o %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET)
注意:Makefile里每个命令行开头必须是制表符(Tab),不能用空格,不然执行make会直接报错。
写完先脱离VSCode验证编译是否正常:在项目根目录跑make clean && make,编译完成后执行file $(TARGET),输出里必须包含arm64字样,再跑lldb ./$(TARGET),进入lldb交互后输入b main能正常下断点、输入r能启动程序停在main函数,说明编译环节完全没问题,问题只可能出在VSCode配置上。如果这步都过不了,先排查Makefile里的源文件路径有没有写错、有没有漏加-g参数。
第二步:配置VSCode的tasks.json和launch.json
首先在项目根目录的.vscode文件夹下新建tasks.json,配置调试前自动执行make编译:
{ "version": "2.0.0", "tasks": [ { "label": "make build", "type": "shell", "command": "make", "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] }, { "label": "make clean", "type": "shell", "command": "make", "args": ["clean"], "problemMatcher": [] } ] }
再新建/修改同目录下的launch.json,注意调试类型必须选lldb,别选cppdbg(那个默认走gdb适配,M1上很容易出问题):
{ "version": "0.2.0", "configurations": [ { "name": "Debug C Program", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/your_app_name", // 和Makefile里的TARGET保持一致 "preLaunchTask": "make build", "args": [], // 程序运行需要的命令行参数填在这里 "cwd": "${workspaceFolder}", "stopAtEntry": true } ] }
M1场景常见踩坑排查
- 不要用Rosetta转译打开VSCode,不然会编译出x86_64架构的可执行文件,和原生arm64的lldb不匹配,断点直接失效。
- 如果断点显示为空心(未绑定),先执行
make clean删掉所有旧的.o文件和可执行文件,重新编译——旧的目标文件如果没带-g参数,VSCode找不到调试符号就会出现这个问题。 - 不要混用Homebrew安装的gcc和系统clang编译的目标文件,不同编译器生成的目标文件格式有差异,链接阶段很容易出架构不兼容的问题,新手直接用系统自带的Apple Clang就行。
按上面的配置走完全可以实现正常调试,不存在M1 Mac架构不支持的问题,不需要额外打补丁或者装特殊版本的软件。
内容的提问来源于stack exchange,提问作者MiguelP
相关产品推荐
相关产品推荐

