将 gdb 与 make 一起使用
Using gdb with make
我想在我的应用程序中使用 gdb 来调试所有库。我使用 make
来编译应用程序,如果我尝试 gdb,它会显示 no debugging symbols found
。
如何修改我的 makefile 以使用 -g
标志?
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -c sharedmem.c
message.o: message.c message.h
gcc -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -c semaphore.c
config.o: config.c config.h
gcc -c config.c
logger.o: logger.c logger.h
gcc -c logger.c
utils.o: utils.c utils.h
gcc -c utils.c
clean:
rm -f *.o
为所有编译添加-g
选项。
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -g -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -g -c sharedmem.c
message.o: message.c message.h
gcc -g -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -g -c semaphore.c
config.o: config.c config.h
gcc -g -c config.c
logger.o: logger.c logger.h
gcc -g -c logger.c
utils.o: utils.c utils.h
gcc -g -c utils.c
clean:
rm -f *.o
但是您最好使用 default rules 进行编译,而不是显式输入所有 .c -> .o
操作。默认规则使用 $(CPPFLAGS) $(CFLAGS)
,您可以在命令行上进行设置。所以当你想在启用调试的情况下编译时,你可以这样做:
make clean
make CFLAGS=-g hospital
您所问的答案是在编译目标文件时添加“-g”开关,即
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -g -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -g -c sharedmem.c
message.o: message.c message.h
gcc -g -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -g -c semaphore.c
config.o: config.c config.h
gcc -g -c config.c
logger.o: logger.c logger.h
gcc -g -c logger.c
utils.o: utils.c utils.h
gcc -g -c utils.c
clean:
rm -f *.o
但是,像这样的Makefile 真的很难维护。 Make 可以为你做很多这样的事情,看看 this example 应该适合你的项目。只需将“-g”添加到 CFLAGS 变量即可。
即使像这样更小的东西也能满足您的要求:
PROGRAM := hostpital
SRCS := $(wildcard *.c)
OBJS := ${SRCS:.c=.o}
CFLAGS=-g
$(PROGRAM): $(OBJS)
$(CC) $(OBJS) -o $(PROGRAM)
clean:
@- $(RM) $(PROGRAM)
@- $(RM) $(OBJS)
注意:
Makefile 在操作之前需要制表符。用制表符替换前导空格。
我想在我的应用程序中使用 gdb 来调试所有库。我使用 make
来编译应用程序,如果我尝试 gdb,它会显示 no debugging symbols found
。
如何修改我的 makefile 以使用 -g
标志?
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -c sharedmem.c
message.o: message.c message.h
gcc -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -c semaphore.c
config.o: config.c config.h
gcc -c config.c
logger.o: logger.c logger.h
gcc -c logger.c
utils.o: utils.c utils.h
gcc -c utils.c
clean:
rm -f *.o
为所有编译添加-g
选项。
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -g -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -g -c sharedmem.c
message.o: message.c message.h
gcc -g -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -g -c semaphore.c
config.o: config.c config.h
gcc -g -c config.c
logger.o: logger.c logger.h
gcc -g -c logger.c
utils.o: utils.c utils.h
gcc -g -c utils.c
clean:
rm -f *.o
但是您最好使用 default rules 进行编译,而不是显式输入所有 .c -> .o
操作。默认规则使用 $(CPPFLAGS) $(CFLAGS)
,您可以在命令行上进行设置。所以当你想在启用调试的情况下编译时,你可以这样做:
make clean
make CFLAGS=-g hospital
您所问的答案是在编译目标文件时添加“-g”开关,即
hospital: hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
gcc -o hospital hospital.o config.o utils.o message.o semaphore.o sharedmem.o logger.o
hospital.o: hospital.c
gcc -g -c hospital.c
sharedmem.o: sharedmem.c sharedmem.h
gcc -g -c sharedmem.c
message.o: message.c message.h
gcc -g -c message.c
semaphore.o: semaphore.c semaphore.h
gcc -g -c semaphore.c
config.o: config.c config.h
gcc -g -c config.c
logger.o: logger.c logger.h
gcc -g -c logger.c
utils.o: utils.c utils.h
gcc -g -c utils.c
clean:
rm -f *.o
但是,像这样的Makefile 真的很难维护。 Make 可以为你做很多这样的事情,看看 this example 应该适合你的项目。只需将“-g”添加到 CFLAGS 变量即可。
即使像这样更小的东西也能满足您的要求:
PROGRAM := hostpital
SRCS := $(wildcard *.c)
OBJS := ${SRCS:.c=.o}
CFLAGS=-g
$(PROGRAM): $(OBJS)
$(CC) $(OBJS) -o $(PROGRAM)
clean:
@- $(RM) $(PROGRAM)
@- $(RM) $(OBJS)
注意: Makefile 在操作之前需要制表符。用制表符替换前导空格。