Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在makefile中应用DRY原理_C++_Makefile - Fatal编程技术网

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,编写测试并查看结果通常比问问题并等待别人回答要快得多:)