如何使用-j选项维护makefile中多个目标的序列 < >我有一个生成C++文件的脚本。首先,我想生成这些文件。 然后在库中编译它们。 我想在单个Makefile中执行此操作 TARGETS = GEN_FILE LIBNAME GEN_FILE: input BINARYTOGEN input OBJ =(GENERATED_FILES:.cpp-.o) LIBNAME: $(OBJ) cc $(OBJ)

如何使用-j选项维护makefile中多个目标的序列 < >我有一个生成C++文件的脚本。首先,我想生成这些文件。 然后在库中编译它们。 我想在单个Makefile中执行此操作 TARGETS = GEN_FILE LIBNAME GEN_FILE: input BINARYTOGEN input OBJ =(GENERATED_FILES:.cpp-.o) LIBNAME: $(OBJ) cc $(OBJ),makefile,Makefile,如何确保在并行环境中使用–j选项时,目标GEN_文件始终在LIBNAME之前运行 一种方法是,不平行 .generated_marker: a.gen b.gen touch a.cpp touch b.cpp touch $@ SRCS = a.cpp b.cpp $(SRCS): .generated_marker OBJ = $(SRCS:.cpp=.o) OUT = ./libutils.a .PHONY: all all: $(OUT) .SUFFI

如何确保在并行环境中使用–j选项时,目标GEN_文件始终在LIBNAME之前运行

一种方法是,不平行

 .generated_marker: a.gen b.gen
   touch a.cpp
   touch b.cpp
   touch $@

 SRCS = a.cpp b.cpp

$(SRCS): .generated_marker

OBJ = $(SRCS:.cpp=.o)

OUT = ./libutils.a

.PHONY: all
all: $(OUT)

 .SUFFIXES: .cpp

 LIBS = -L…

  INCLUDES = -I…..

 .cpp.o:
         gcc $(INCLUDES) -g -c $< -o $@

  $(OUT): $(OBJ)
         ar rcs $(OUT) $(OBJ)
。生成的\u标记:a.gen b.gen
触摸a.cpp
触摸b.cpp
触碰$@
SRCS=a.cpp b.cpp
$(SRCS):.生成的\u标记
OBJ=$(SRCS:.cpp=.o)
OUT=./libutils.a
冒牌货:全部
全部:$(外)
.后缀:.cpp
LIBS=-L…
INCLUDES=-I…。。
.cpp.o:
gcc$(包括)-g-c$<-o$@
$(OUT):$(OBJ)
ar rcs$(OUT)$(OBJ)

如果生成器处理单个源文件并生成单个输出文件,则很简单-只需添加模式规则,例如:

all: a.out

%.c: %.gen
    cp $< $@

SRCS:=a.c b.c

a.out: $(SRCS)
    gcc $^

如何确保目标genu文件始终在LIBNAME之前运行
-只需使
LIBNAME
依赖于
genu文件
:将string
LIBNAME:genu文件
添加到makefile中。我做到了。但是使用make-j选项,它似乎不起作用,嗯,它应该起作用。当它不起作用时,你能举个例子吗?对于可视化执行顺序,您可以将类似打印的收据(例如,
echo$@
)添加到两个目标(
GEN_FILE
LIBNAME
)中。我没有生成的源文件的名称。a、 c.b.c在生成之前是未知的。我只能通过ls*获取源名称。cIt不会改变任何东西
touch
就是一个例子,用你的发电机来代替它。再想想,它确实如此。那么,您打算从何处获取
生成的_文件
?我的生成器获取一个输入xml文件并生成多个cpp文件。一旦生成器运行,我可以尝试使用
eval
,精确地执行$(通配符$(OUTPUT_DIR/*.cpp)。我不认为您可以添加这样的依赖项。它可能可以通过额外的虚假目标来实现,但这种方法只会带来问题。您可以为您的问题添加更多细节吗?
all: a.out

.generated_marker: a.gen b.gen
    touch a.c
    touch b.c
    touch $@

SRCS:=a.c b.c

$(OBJS):=$(SRCS:.c=.o)

$(OBJS): .generated_marker

a.out: $(OBJS)
    gcc $^