我从 Hilton Lipschitz 的博客中制作了一个 Makefile ,并对其进行了少许更改以生成调试信息。主要部分列出:
CC := clang -arch x86_64
CFLAGS := -c -O0
$(TARGET): $(OBJECTS)
@echo " Linking $(TARGET)"; $(CC) $^ -o $(TARGET) $(LIB)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(BUILDLIST)
@echo "Compiling $<..."; $(CC) $(CFLAGS) $(INC) -o $@ $<
debug: CFLAGS += -g
debug: $(TARGET)
现在make
运行这些命令(路径用 总结...
):
clang -arch x86_64 -c -O0 -I... -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L...
make debug
运行这些命令时:
clang -arch x86_64 -c -O0 -g -I... -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L...
问题是当我执行make
or时make debug
,program.dSYM
文件夹中不会创建子bin
文件夹。相反,当我在没有-c
参数的情况下编译时:
clang -arch x86_64 -g -O0 -I... -L... -o bin/program.o src/program.c
两个可执行文件,并.dSYM
在bin
文件夹中创建。
- 如何在分离编译和链接过程的同时向此 Makefile 添加调试信息生成功能?
- 在哪一步(编译/链接)中产生调试信息?
更新:我创建了一个 GitHub存储库并将相关的 Makefile 和源上传到它。要重现该问题,请在终端中运行以下命令:
git clone https://github.com/hamid914/gdb-lldb-test.git
cd gdb-lldb-test
make debug
最后一行,make debug
执行这些命令:
clang -arch x86_64 -c -O0 -std=c11 -g -I include -I include/libs -I /usr/local/include -o build/program.o src/program.c
clang -arch x86_64 build/program.o -o bin/program -L /usr/local/lib -lm -g
bin
文件夹的内容是:
$ ls bin
program
如果我clang
不带-c
参数运行:
clang -arch x86_64 -O0 -std=c11 -g -I include -I include/libs -I /usr/local/include -L /usr/local/lib -lm -o bin/program src/program.c
bin
文件夹内容如下:
$ ls bin
program program.dSYM