C++ C++;包含ddd调试器选项的Makefile
我是Makefiles的新手,我试图在我的makefile中包含一个调试器选项,当我键入“makedebug”时,它会打开调试器。但是,该命令返回一个错误。我的虚拟机中已经安装了ddd调试器。下面是我的makefile。有什么帮助吗C++ C++;包含ddd调试器选项的Makefile,c++,debugging,makefile,C++,Debugging,Makefile,我是Makefiles的新手,我试图在我的makefile中包含一个调试器选项,当我键入“makedebug”时,它会打开调试器。但是,该命令返回一个错误。我的虚拟机中已经安装了ddd调试器。下面是我的makefile。有什么帮助吗 main: main.cpp puzzle.cpp fuse.cpp g++ --std=c++11 -o main main.cpp ./main clean: -rm -f *.o main debug: g++ --std=c+
main: main.cpp puzzle.cpp fuse.cpp
g++ --std=c++11 -o main main.cpp
./main
clean:
-rm -f *.o main
debug:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
ddd debug
需要单独在线才能作为单独的命令执行,并且需要添加缺少的-o
开关:
debug:
g++ --std=c++11 -g -o debug main.cpp puzzle.cpp fuse.cpp
ddd debug
但是,如果debug
已经存在,则不会执行此操作make
尝试优化,如果目标已经存在,或者比列出的依赖项(没有)新,则不会运行配方
相反,把这条规则分成两部分。二进制文件(列出了依赖项)和run命令(应标记为虚假目标)。即使存在与配方输出名称同名的文件(本例中为rundebug
),虚假目标也会确保配方仍然运行
这样,make run debug
将始终调用调试器(如果编译成功),但如果debug
二进制文件比源文件新,则不会执行编译
我不太熟悉
ddd
,但是一些调试器会以类似于shell的方式查找二进制文件,因此您可能需要将ddd
行修改为:
ddd ./debug
别忘了修补你的
clean
规则(1)删除debug
和(2)假装:
clean:
-rm -f *.o main debug
.PHONY: clean run-debug
ddd debug
需要单独在线才能作为单独的命令执行,并且需要添加缺少的-o
开关:
debug:
g++ --std=c++11 -g -o debug main.cpp puzzle.cpp fuse.cpp
ddd debug
但是,如果debug
已经存在,则不会执行此操作make
尝试优化,如果目标已经存在,或者比列出的依赖项(没有)新,则不会运行配方
相反,把这条规则分成两部分。二进制文件(列出了依赖项)和run命令(应标记为虚假目标)。即使存在与配方输出名称同名的文件(本例中为rundebug
),虚假目标也会确保配方仍然运行
这样,make run debug
将始终调用调试器(如果编译成功),但如果debug
二进制文件比源文件新,则不会执行编译
我不太熟悉
ddd
,但是一些调试器会以类似于shell的方式查找二进制文件,因此您可能需要将ddd
行修改为:
ddd ./debug
别忘了修补你的
clean
规则(1)删除debug
和(2)假装:
clean:
-rm -f *.o main debug
.PHONY: clean run-debug
TL;DR
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
这行有误。它告诉G++使用选项--std=c++11-G
,编译给定的文件列表,包括“ddd”和“debug”(两次)到a.out
(或者a.exe
,如果您在Windows/Cygwin上)
这不是你想要的,并且“调试”和“DDD”不太可能是有效的C++源文件,编译器运行失败。
如果键入
make debug
,则make
将执行debug
规则:
debug:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
如果不存在名为debug
的文件(*),make
将尝试使用以下命令重新创建该文件:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
我不太清楚你希望那个命令做什么。我猜您打算按顺序执行两个命令:
debug:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp
ddd debug
但是,编译器行出错。我猜你想要这样的东西(注意-o
):
这是打破了几个方面 此规则指示
make
在触摸任何文件main.cpp
、puzzle.cpp
或fuse.cpp
时从头开始重建main
。但是,您给出的命令仅重新编译main.cpp
——其他两个文件永远不会(重新)编译
一个好的Makefile规则只做(重新)构建它所命名的文件所需的事情,并且尽可能通用
例如,“告诉”make如何从任何给定的*.cpp
文件($
和@TL;DR
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
此行出错。它告诉G++使用选项编译给定的文件列表,包括“ddd”和“debug”(两次)到a.out
(或者a.exe
,如果您在Windows/Cygwin上)
这不是你想要的,并且“调试”和“DDD”不太可能是有效的C++源文件,编译器运行失败。
如果键入make debug
,则make
将执行debug
规则:
debug:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
如果不存在名为debug
的文件(*),make
将尝试使用以下命令重新创建该文件:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp ddd debug
我不太清楚您希望该命令做什么。我猜您打算按顺序执行两个命令:
debug:
g++ --std=c++11 -g debug main.cpp puzzle.cpp fuse.cpp
ddd debug
但是,编译器行出错。我想您需要这样的代码(注意-o
):
这是打破了几个方面
此规则指示make
在触摸任何文件main.cpp
、puzzle.cpp
或fuse.cpp
时从头开始重建main
。但是,您发出的命令仅重新编译main.cpp
——其他两个文件永远不会(重新)编译
一个好的Makefile规则只做(重新)构建它所命名的文件所需的事情,并且尽可能通用
例如,要“告诉”make如何从任何给定的*.cpp
文件($@
和@创建*.o
文件,您会收到什么错误消息?您会收到什么错误消息?