如何使用makefile调试项目

5

我是一个在makefile和使用多个文件的项目中都是新手。我现在正在处理的项目有一个main.c和两个用户库。以下是makefile代码:

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

我应该怎么做?


3
你清理过你的项目了吗?因为如果在编译之后添加了“-g”选项,那么make不会重新构建。 - Jean-François Fabre
5
顺便说一下,$(CC) -g -c main.c path.h util.h意为编译main.cpath.hutil.h这三个文件,但是在实际操作中应该只编译main.c,不需要编译头文件。因此建议改为$(CC) -g -c main.c - Jean-François Fabre
清理项目是什么意思? - Nepec
1
清除后重新构建。 - Jean-François Fabre
请注意,与大多数新手不同,您之所以获得这么多赞是因为您实际上正在尝试调试代码 :) - Jean-François Fabre
1个回答

3

发生这种情况是因为

  • 您已经在没有-g标志的情况下构建了您的对象/可执行文件
  • 您稍后添加了 -g 标志

在makefile中添加选项不会自动触发重新编译。由于您有一个clean目标,只需执行以下操作即可:

make clean
make

使用-g选项重新构建对象:现在生成的可执行文件带有符号。愉快地进行调试吧。

另外注意,不要将头文件传递给gcc命令。它们对于make知道依赖关系很有用(如上一行所示),但在从.c文件构建对象时没有用。这样做会创建无用的.o文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接