Makefile 不使用 -g 标志生成调试信息
Makefile not generating debugging information with -g flag
我最近从在终端工作转到 VScode,我需要生成调试信息以与 vscode 中的调试器一起使用。
我的 makefile 是:
SRCS = src/ft_argcheck.c \
src/ft_operations.c \
src/ft_stcutils.c \
src/push_swap.c
NAME = push_swap
INCS = inc/push_swap.h
OBJS = $(SRCS:c=o)
CC = gcc
CFLAGS = -g -Wall -Wextra -Werror
RM = rm -f
LIBFT = libft/libft.a
LIBFT_DIR = libft
.PHONY: all bonus clean fclean re
all: $(NAME)
$(NAME): $(OBJS)
@make -C $(LIBFT_DIR) --silent
@$(CC) $(CFLAGS) -I$(INCS) -o $(NAME) $(OBJS) -L $(LIBFT_DIR) -lft
clean:
@$(RM) $(OBJS)
@make -s clean -C $(LIBFT_DIR)
fclean: clean
@$(RM) $(NAME)
@make -s fclean -C $(LIBFT_DIR)
re: fclean all
但是尽管添加了-g 标志,但没有生成任何调试信息。我可以 运行 lldb.
一个好的建议是删除命令名称前面的 @
s 以查看 make
正在执行什么命令....要使程序可调试,您需要检查所有编译步骤都是使用 -g
标志完成的,并且链接步骤还包括 -g
标志。另外一个好的选择是指定不优化,这样你就不会遇到无法修复的断点问题,因为编译器已经删除或更改了最终代码,并且破坏了源代码行和代码中的点之间的对应关系。
如果你把那里的所有 @
都去掉,你会看到 make
正在执行的命令,你想你现在看不到了。我认为有一个命令(berkeley make 有它)使 make
打印命令,即使 @
s 仍然存在。
顺便说一下,正如你所说的,你正在使用 vscode
如果你单独在命令行上执行 make
应该没问题,看看命令的输出,并尝试看看是不是 make 的问题还是 vscode 本身的问题。
由于你没有提供完整的工程,很抱歉我只能用dumb/fake个文件来测试,没有程序可以用gdb来测试。
我猜问题出在你的项目源码放在了和程序构建目录不同的目录下,gdb找不到源码,所以无法进行源码调试,因为gdb找不到源文件。 Gdb 有一些方法可以指定源文件的路径...您应该查看 gdb 文档。
感谢您的所有回答(删除 @ 并没有真正给我更多信息,因为它确实显示了 -g 标志,我已经尝试用 fclean 重新制作所有内容)。在朋友的帮助下,我似乎找到了一个简单的解决方法:
添加规则“调试”
debug:
$(CC) -g $(CFLAGS) -I$(INCS) $(LIBFT) $(SRCS) -o $(NAME)
我们可以 运行 就在我们想要生成调试信息时 运行 直接使用 $(SRCS) 而不是 运行 在 $(OBJS) 上生成调试信息与正常命令一样。
我最近从在终端工作转到 VScode,我需要生成调试信息以与 vscode 中的调试器一起使用。
我的 makefile 是:
SRCS = src/ft_argcheck.c \
src/ft_operations.c \
src/ft_stcutils.c \
src/push_swap.c
NAME = push_swap
INCS = inc/push_swap.h
OBJS = $(SRCS:c=o)
CC = gcc
CFLAGS = -g -Wall -Wextra -Werror
RM = rm -f
LIBFT = libft/libft.a
LIBFT_DIR = libft
.PHONY: all bonus clean fclean re
all: $(NAME)
$(NAME): $(OBJS)
@make -C $(LIBFT_DIR) --silent
@$(CC) $(CFLAGS) -I$(INCS) -o $(NAME) $(OBJS) -L $(LIBFT_DIR) -lft
clean:
@$(RM) $(OBJS)
@make -s clean -C $(LIBFT_DIR)
fclean: clean
@$(RM) $(NAME)
@make -s fclean -C $(LIBFT_DIR)
re: fclean all
但是尽管添加了-g 标志,但没有生成任何调试信息。我可以 运行 lldb.
一个好的建议是删除命令名称前面的 @
s 以查看 make
正在执行什么命令....要使程序可调试,您需要检查所有编译步骤都是使用 -g
标志完成的,并且链接步骤还包括 -g
标志。另外一个好的选择是指定不优化,这样你就不会遇到无法修复的断点问题,因为编译器已经删除或更改了最终代码,并且破坏了源代码行和代码中的点之间的对应关系。
如果你把那里的所有 @
都去掉,你会看到 make
正在执行的命令,你想你现在看不到了。我认为有一个命令(berkeley make 有它)使 make
打印命令,即使 @
s 仍然存在。
顺便说一下,正如你所说的,你正在使用 vscode
如果你单独在命令行上执行 make
应该没问题,看看命令的输出,并尝试看看是不是 make 的问题还是 vscode 本身的问题。
由于你没有提供完整的工程,很抱歉我只能用dumb/fake个文件来测试,没有程序可以用gdb来测试。
我猜问题出在你的项目源码放在了和程序构建目录不同的目录下,gdb找不到源码,所以无法进行源码调试,因为gdb找不到源文件。 Gdb 有一些方法可以指定源文件的路径...您应该查看 gdb 文档。
感谢您的所有回答(删除 @ 并没有真正给我更多信息,因为它确实显示了 -g 标志,我已经尝试用 fclean 重新制作所有内容)。在朋友的帮助下,我似乎找到了一个简单的解决方法:
添加规则“调试”
debug:
$(CC) -g $(CFLAGS) -I$(INCS) $(LIBFT) $(SRCS) -o $(NAME)
我们可以 运行 就在我们想要生成调试信息时 运行 直接使用 $(SRCS) 而不是 运行 在 $(OBJS) 上生成调试信息与正常命令一样。