Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
如何在makefile中的另一个规则中运行模式规则?_Makefile_Gnu Make - Fatal编程技术网

如何在makefile中的另一个规则中运行模式规则?

如何在makefile中的另一个规则中运行模式规则?,makefile,gnu-make,Makefile,Gnu Make,我希望编写一个makefile来自动编译我正在处理的项目,其中文件的数量可能会改变,也可能不会改变。我还需要能够快速告诉make将文件编译为调试版本或发布版本(由命令行定义区分)。经过一些研究,我发现了模式规则并制定了一个。以下是我目前掌握的代码: # Our folders # ODIR - The .o file directory # CDIR - The .cpp file directory # HDIR - The .hpp file directory ODIR

我希望编写一个makefile来自动编译我正在处理的项目,其中文件的数量可能会改变,也可能不会改变。我还需要能够快速告诉make将文件编译为调试版本或发布版本(由命令行定义区分)。经过一些研究,我发现了模式规则并制定了一个。以下是我目前掌握的代码:

# Our folders
# ODIR -    The .o file directory
# CDIR -    The .cpp file directory
# HDIR -    The .hpp file directory
ODIR = obj
CDIR = src
HDIR = inc

# Get our compiler and compiler commands out of the way
# CC -  Our compiler
# CFNO - Our compiler flags for when we don't have an output file
# CF -  Our compiler flags. This should be appended to any compile and should
#           have the name of the output file at the end of it.
# OF -  Object flags. This should be appended to any line that is generating
#           a .o file. 
CC = g++
CFNO = -std=c++11 -wall -Wno-write-strings -Wno-sign-compare -lpaho-mqtt3c -pthread -O2 -I$(HDIR)
CF = $(CFNO) -o
OF = -c

# Our project/output name
NAME = tls_test

# Set out Debug and Release settings, as well as any defines we will use to identify which mode we are in
# NOTE: '-D[NAME OF DEFINE]' is how you create a define through the compile commands
DEBUG = -DDEBUG -g
RELEASE = -DRELEASE

# Our two compile modes
# eval allows us to create variables mid-rule
debug:
    $(eval DR = $(DEBUG))

release:
    $(eval DR = $(RELEASE))

# Our compiling commands
all: 
    $(CC) $(CF) $(NAME) $(ODIR)/*.o

# NOTE: $@ is the end product being created and $< is the first of the prerequisite
$(ODIR)/%.o: $(CDIR)/%.c
    echo "$(CC) $(DR) $(OF) $(CF) $@ $<"
#我们的文件夹
#ODIR-文件目录
#CDIR-.cpp文件目录
#HDIR-.hpp文件目录
ODIR=obj
CDIR=src
HDIR公司
#把我们的编译器和编译器命令放到一边去
#CC-我们的编译器
#CFNO-没有输出文件时的编译器标志
#CF-我们的编译器标志。这应该附加到任何编译中,并且应该
#在输出文件的末尾有输出文件的名称。
#OF-Object标志。这应该附加到正在生成的任何行
#一个.o文件。
CC=g++
CFNO=-std=c++11-wall-Wno write strings-Wno符号比较-lpaho-mqtt3c-pthread-O2-I$(HDIR)
CF=$(CFNO)-o
OF=-c
#我们的项目/输出名称
名称=tls\U测试
#设置调试和发布设置,以及我们将用于确定处于哪种模式的任何定义
#注意:“-D[NAME OF DEFINE]”是通过编译命令创建DEFINE的方式
DEBUG=-DDEBUG-g
RELEASE=-DRELEASE
#我们的两种编译模式
#eval允许我们在规则中创建变量
调试:
$(评估DR=$(调试))
发布:
$(评估灾难恢复=$(发布))
#我们的编译命令
全部:
$(CC)$(CF)$(名称)$(ODIR)/*.o
#注意:$@是正在创建的最终产品,$<是先决条件中的第一个
$(ODIR)/%.o:$(CDIR)/%.c

echo“$(CC)$(DR)$(OF)$(CF)$@$使用特定于目标的变量

虽然分离标志不是绝对必要的,但在管理生成选项方面有很大的帮助,然后您可以使用附加来切换标志。在这样做时,您还可以使用内置变量名

我还添加了依赖项生成(
-MMD-MP
),因为它总是有用的

ODIR := obj
CDIR := src
HDIR := inc

SRCS := $(wildcard $(CDIR)/*.cpp)
OBJS := $(SRCS:$(CDIR)/%.cpp=$(ODIR)/%.o)
DEPS := $(OBJS:%.o=%.d)

CPPFLAGS := -I$(HDIR) -MMD -MP
CXXFLAGS := -std=c++11 -Wall -Wno-write-strings -Wno-sign-compare -pthread -O2
LDFLAGS  := -pthread
LDLIBS   := -lpaho-mqtt3c

NAME := tls_test

.PHONY: debug release clean

debug: CPPFLAGS+=-DDEBUG
debug: CXXFLAGS+=-g

release: CPPFLAGS+=-DRELEASE

debug release: $(NAME)

$(NAME): $(OBJS)
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJS): $(ODIR)/%.o: $(CDIR)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(OUTPUT_OPTION) $<

clean: ; $(RM) $(NAME) $(OBJS) $(DEPS)    

-include $(DEPS)
ODIR:=obj
CDIR:=src
HDIR:=公司
SRCS:=$(通配符$(CDIR)/*.cpp)
OBJS:=$(SRCS:$(CDIR)/%.cpp=$(ODIR)/%.o)
部门:=$(对象:%.o=%.d)
CPPFLAGS:=-I$(HDIR)-MMD-MP
CXXFLAGS:=-std=c++11-Wall-Wno write strings-Wno sign compare-pthread-O2
LDFLAGS:=-pthread
LDLIBS:=-lpaho-mqtt3c
名称:=tls\U测试
.PHONY:debug-release-clean
调试:CPPFLAGS+=-DDEBUG
调试:CXXFLAGS+=-g
发布:CPPFLAGS+=-DRELEASE
调试版本:$(名称)
$(名称):$(OBJS)
$(CXX)$(LDFLAGS)$^$(LDLIBS)-o$@
$(OBJS):$(ODIR)/%.o:$(CDIR)/%.cpp
$(CXX)$(CXXFLAGS)$(CPPFLAGS)-c$(输出_选项)$<
清洁:;$(RM)$(名称)$(OBJS)$(DEPS)
-包括美元(DEPS)

您希望Make编译
src/
中的所有源文件(带有适合于构建的标志),然后将所有生成的对象文件链接到一个可执行文件中,对吗?我可以猜出您想要的
OUTPUT\u OPTION
是什么,但您可能应该把它拼出来。@Beta为什么,将默认值设为
-o$@
。我已经更正了。我不知道这个变量,但现在我知道了,我看不出它使这个makefile有任何意义更容易理解或维护。@Beta可能不是,但这是内置规则使用的,所以我认为它也可以放在那里,尽管我从未使用过不支持
-o
的编译器。如果OP连续运行
进行调试
,然后
进行发布
,则不会重新编译对象(除非gcc依赖项生成比我现在认为的更聪明)。