C++ C++;包含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+

我是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++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
文件,您会收到什么错误消息?您会收到什么错误消息?