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

MacOS下使用Make构建未生成dSYM目录的问题与解决方法

解决MacOS下Makefile编译不生成.dSYM目录的问题

问题场景

在MacOS 12.7.5(Monterey)环境中,使用gcc 13.2.0编译C代码、gnu make 3.81构建项目(偏好命令行工具而非XCode):

  • 当在Makefile中设置CFLAGS=-g时,可执行文件包含完整调试符号,但未生成.dSYM目录;
  • 直接在命令行执行gcc -g filename1.c filename2.c -o filename则会自动生成.dSYM目录。

需求:通过配置Makefile实现.dSYM目录的自动生成,无需拆分构建任务。

解决方案

利用Apple提供的dsymutil工具,在每个可执行目标的编译步骤后添加该工具的调用。若需仅在开启调试符号(即CFLAGS包含-g)时生成.dSYM,可通过Make的条件判断实现。

关键配置说明

  • 在目标的编译命令后添加条件执行逻辑:
    ifneq (,$(findstring -g, $(CFLAGS)))
    	/usr/bin/dsymutil $@
    endif
    
  • 注意:ifneq和endif语句不能有前置制表符,只有实际执行的dsymutil命令前需要加制表符(Make要求命令行必须以制表符开头)。

修改后的完整Makefile示例

# make description file to build a family of hashing programs

LANG   = -std=c11
GCOBJS = distanceGC.o hashtblGC.o ../GreatCircle/greatcircle.o
FOBJS  = ftlhash.o
HOBJS  = hashtbl.o argv.o

GCHDRS = hashGC.h ../GreatCircle/greatcircle.h
FHDRS  = ftlhash.h
HHDRS  = hashtbl.h ftlhash.h

CC     = gcc
CFLAGS = -g -Wall

distanceGC : ${GCOBJS}
	${CC} ${LANG} ${CFLAGS} -o $@ ${GCOBJS}
ifneq (,$(findstring -g, $(CFLAGS)))
	/usr/bin/dsymutil $@
endif

${GCOBJS} : ${GCHDRS}

../GreatCircle/greatcircle.o : ../GreatCircle/greatcircle.h
	cd /Users/wills/src/c/GreatCircle; make all

ftlhash : ${FOBJS}
	${CC} ${LANG} ${CFLAGS} -o $@ ${FOBJS}
ifneq (,$(findstring -g, $(CFLAGS)))
	/usr/bin/dsymutil $@
endif

${FOBJS} : ${FHDRS}

hashtbl : ${HOBJS}
	${CC} ${LANG} ${CFLAGS} -o $@ ${HOBJS}
ifneq (,$(findstring -g, $(CFLAGS)))
	/usr/bin/dsymutil $@
endif

${HOBJS} : ${HHDRS}

all : ftlhash hashtbl distanceGC

clean :
	/bin/rm -f core *.o
	cd /Users/wills/src/c/GreatCircle; /bin/rm -f core *.o
	/bin/rm /Users/wills/src/c/HASHTABLE/greatcircle.h
	/bin/ln -s /Users/wills/src/c/GreatCircle/greatcircle.h /Users/wills/src/c/HASHTABLE/greatcircle.h

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:12:07