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
相关产品推荐
相关产品推荐

