如何在Makefile(-c -g)中使用单独的编译/链接进程在gcc / clang中生成调试信息?

时间:2016-10-13 00:37:36

标签: macos gcc makefile clang dsym

我从希尔顿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时,program.dSYM文件夹中不会生成bin子文件夹。相反,当我编译时没有-c参数:

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

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

  1. 如何在分离编译和链接过程时向此Makefile添加调试信息生成功能?
  2. 在哪个步骤(编译/链接)生成调试信息?
  3. 更新:我创建了一个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
    

    如果我在没有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
    

1 个答案:

答案 0 :(得分:0)

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

debug: LDFLAGS += -g

但是你所遵循的例子没有充分的理由来定义它自己的变量,但看起来LIB应该可行。