C++ 在makefile中应用DRY原理
就拿这个实例的一个用例来说。我正在编译一个C++ 在makefile中应用DRY原理,c++,makefile,C++,Makefile,就拿这个实例的一个用例来说。我正在编译一个c++文件,有时我希望编译时不使用调试符号,即启用-g,有时我希望启用它 因此,我考虑只创建两个目标,其中第二个目标将重新分配make变量(如果可能),并更改编译选项。我想知道这样的行为是否可以通过makefile实现 下面是一些伪代码演示,用户输入makefirst@bg进入命令行: gpp = g++ -std=c++17 first: hello.cpp $(gpp) hello.cpp -o $@ #/* some other
c++
文件,有时我希望编译时不使用调试符号,即启用-g
,有时我希望启用它
因此,我考虑只创建两个目标,其中第二个目标将重新分配make变量(如果可能),并更改编译选项。我想知道这样的行为是否可以通过makefile实现
下面是一些伪代码演示,用户输入makefirst@bg
进入命令行:
gpp = g++ -std=c++17
first: hello.cpp
$(gpp) hello.cpp -o $@
#/* some other recipes, assuming the list is really long*/
first@bg: main.o
gpp = g++ -g -std=c++17
execute_all_recipe_of_first_target_which_is_really_long_to_copy()
main.o: main.cpp
$(gpp) main.cpp -c -o main.o #the value of gpp should'd also changed here since first@bg executed
如果可能,请向我提供演示行为的实际语法。提前感谢。您可以这样做:
first@bg: gpp += -g
first@bg: first
请注意,定义CXX=g++
和cxflags=-std=c++17
然后调整cxflags
,并使用make DEBUG=1
进行调试构建更为惯用:
CXX=g++
CXXFLAGS=-std=c++17
ifeq ($(DEBUG), 1)
CXXFLAGS+=-g
endif
然后以$(CXX)$(cxflags)hello.cpp-o$@
的形式调用编译器。另请参见您可以执行以下操作:
first@bg: gpp += -g
first@bg: first
请注意,定义CXX=g++
和cxflags=-std=c++17
然后调整cxflags
,并使用make DEBUG=1
进行调试构建更为惯用:
CXX=g++
CXXFLAGS=-std=c++17
ifeq ($(DEBUG), 1)
CXXFLAGS+=-g
endif
然后以$(CXX)$(cxflags)hello.cpp-o$@
的形式调用编译器。另请参见在您的第一段代码中,我们可以在
先决条件部分分配变量吗?在第二段代码中,变量DEBUG
是否必须在makefile
中声明,然后再通过命令行传递,在这种情况下,我们必须给它一个默认值或垃圾值?如果没有定义,任何make变量引用都将扩展到空字符串。所以如果你不想,你不必预先定义它。我不确定你所说的先决条件部分是什么意思,但答案应该会将你链接到目标特定变量分配的文档:@MadScientist,链接说目标特定变量只存在于它的配方中,这是否意味着它不适用于它的先决条件部分中列出的另一个目标。(Make有target:prerequisite\t recipe
格式,这是我所说的先决条件)您的问题直接在文档中解决。请继续阅读开头的段落,还有一个特点。。。而且。。。请随意测试!!特别是对于makefiles,编写一个测试并查看发生了什么,通常比问一个问题并等待别人回答要快得多:)在您的第一块代码中,我们可以在先决条件
部分分配变量吗?在第二段代码中,变量DEBUG
是否必须在makefile
中声明,然后再通过命令行传递,在这种情况下,我们必须给它一个默认值或垃圾值?如果没有定义,任何make变量引用都将扩展到空字符串。所以如果你不想,你不必预先定义它。我不确定你所说的先决条件部分是什么意思,但答案应该会将你链接到目标特定变量分配的文档:@MadScientist,链接说目标特定变量只存在于它的配方中,这是否意味着它不适用于它的先决条件部分中列出的另一个目标。(Make有target:prerequisite\t recipe
格式,这是我所说的先决条件)您的问题直接在文档中解决。请继续阅读开头的段落,还有一个特点。。。而且。。。请随意测试!!特别是对于makefiles,编写测试并查看结果通常比问问题并等待别人回答要快得多:)