【问题标题】:How to generate debug information in gcc/clang with separated compilation/link process in Makefile (-c -g)?如何使用 Makefile (-c -g) 中的单独编译/链接过程在 gcc/clang 中生成调试信息?
【发布时间】:2017-02-21 23:00:09
【问题描述】:

我从 Hilton Lipschitz 的 blog 制作了一个 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...

问题是当我执行makemake debug 时,bin 文件夹中不会创建program.dSYM 子文件夹。相反,当我在没有 -c 参数的情况下编译时:

clang -arch x86_64 -g -O0 -I... -L... -o bin/program.o src/program.c

可执行文件和.dSYM都在bin文件夹中创建。

  1. 如何在分离编译和链接过程的同时向这个 Makefile 添加调试信息生成功能?
  2. 在哪个步骤(编译/链接)中生成调试信息?

更新:我创建了一个 GitHub repo 并上传了相关的 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

如果我在没有 -c 参数的情况下运行 clang

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

【问题讨论】:

    标签: macos gcc makefile clang dsym


    【解决方案1】:

    为了生成 .dSYM 文件,您还需要将 -g 添加到链接器配方中,标准方法是添加

    debug: LDFLAGS += -g
    

    但您所遵循的示例无缘无故地定义了自己的变量,但看起来LIB 应该可以工作。

    【讨论】:

    • -g 标志添加到链接器不会生成.dSYM 文件。我尝试将-g添加到编译器和链接器,但结果是一样的。
    • @HamidRohani 在您的问题中添加一个独立的示例,它对我来说很好。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多