c - 如何使用 makefile 调试项目

标签 c debugging makefile emacs gdb

我是 makefile 和使用多个文件的项目的新手。我现在正在做的事情有一个 main.c 和两个用户库。这是生成文件:

CC = gcc
OBJECTS = main.o path.o util.o

9_1 : $(OBJECTS)
    $(CC) -g $(OBJECTS) -o 9_1

main.o : main.c path.h util.h
    $(CC) -g -c main.c path.h util.h
path.o : path.c path.h util.h
    $(CC) -g -c path.c path.h util.h
util.o : util.c util.h
    $(CC) -g -c util.c util.h

.PHONY : clean
clean : 
    rm $(OBJECTS)

我希望能够在 Emacs 中调试这个项目(使用多窗口变量)但是当我运行 gdb -i=mi 9_1 时(默认选项)并尝试在 main.c 中添加断点它不允许我这样做。具体来说:我运行 b main.c:25我得到了

No symbol table is loaded. Use the "file" command.
Breakpoint 1 (main.c:25) pending

我该怎么办?

最佳答案

它的发生是因为

  • 您已经在不使用 -g 标志的情况下构建了您的对象/可执行文件
  • 您添加了 -g 标志之后

在 makefile 中添加选项不会自动触发重新编译。既然你有一个 clean 目标,那就去做吧

make clean
make

并且使用 -g 选项重建对象:现在使用符号生成可执行文件。调试愉快。

另外:不要将头文件传递给 gcc 命令。它们很有用,因此 make 知道依赖关系(在上面的行中),但在从 .c 文件构建对象时却不知道。这样做会创建无用的 .o 文件。

关于c - 如何使用 makefile 调试项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714033/

相关文章:

c - C 中变量和内存概念的重用

c++ - `char _3 = ' c'` 在 C 和 C++ 中有效吗?

具有冲突模式的 Makefile 目标

c# - 在发布版本 (C#) 中如何停止对调试函数调用中的参数求值

c# - 如何查看将哪个类作为参数传递给 Rider 中的模板?

c - make 使用 autotools 给出 undefined reference 错误,而自定义 Makefile 工作正常

go - 尽管我已经安装了 libpcap,但仍面临 "lpcap not found"错误

用于以逗号分隔的数据的 C 解析器

c - 访问嵌套结构变量

Ruby 调试器在 STDIN 上失败。获取用户输入