gpt4 book ai didi

生成文件 w. Protocol Buffer 和自动依赖

转载 作者:行者123 更新时间:2023-12-02 09:11:46 26 4
gpt4 key购买 nike

我有一个像这样的 Makefile:

.SECONDARY:

NVCC = nvcc
NVCCFLAGS = --gpu-architecture compute_20

CXX = g++
CXXFLAGS = -O3 -std=c++0x -Wall

CXXLINT = python cpplint.py
CXXLINTFLAGS = --filter=-build/include,-readability/streams,-runtime/sizeof,-whitespace/parens

PROTOC = protoc
PROTOCFLAGS = --cpp_out=.

BINS = my_binary
LIBS = -lcublas -lcusparse
PROTOS = $(wildcard *.proto)
SOURCES = $(wildcard *.cu)
HEADERS = $(wildcard *.cuh)
PBS = $(PROTOS:%.proto=%.pb)
DEPS = $(SOURCES:%.cu=%.d)
TESTS = my_test

all: lint protos
all: deps
all: bins
protos: ${PBS}
deps: ${DEPS}
bins: ${BINS}

clean:
rm -rf *.o *.d *.pb.cc *.pb.h ${BINS} ${TESTS}

lint:
${CXXLINT} ${CXXLINTFLAGS} ${SOURCES}
${CXXLINT} ${CXXLINTFLAGS} ${HEADERS}

tests: lint protos
tests: deps
tests: ${TESTS}
tests: tests-run
tests-run: ${TESTS}
for f in $^; do eval "/usr/bin/time -f \"$$f runtime: %E\" ./$$f"; done

%: %.o
${NVCC} ${NVCCFLAGS} -o $@ $^ ${LIBS}

%.d: %.cu
# ${CXXLINT} ${CXXLINTFLAGS} $*.cu
${NVCC} -M -o $*.d $*.cu

%.o: %.cu
${NVCC} ${NVCCFLAGS} -c -o $@ $*.cu
rm $*.d

%.pb: %.proto
${PROTOC} ${PROTOCFLAGS} $*.proto
${CXX} ${CXXFLAGS} -c -o $*.pb.o $*.pb.cc

ifneq ($(MAKECMDGOALS),clean)
-include ${DEPS}
endif

出现问题是因为在构建原型(prototype)目标之前我无法生成 DEPS。因为构建 Protocol Buffer 会将新的头文件添加到树中,如果在 DEPS 之前没有先完成此操作,则 nvcc -M(生成依赖项)将失败,因为它找不到生成的 *.pb.h 。有什么想法可以解决这个问题吗?

最佳答案

另一个解决方案是让您的依赖文件依赖于 Protocol Buffer 生成的结果。以下代码片段包含执行此操作的所有步骤,因为很难一一解释它们,并在底部对某些项目进行了解释:

CXX_FLAGS      := $(shell pkg-config --cflags protobuf) -xc++
LD_FLAGS := $(shell pkg-config --libs protobuf)

PROTOS := $(wildcard *.proto)
PROTO_OBJS := $(PROTOS:.proto=.pb.o)

BINS := my_binary

SRCS := $(wildcard *.cu)
OBJS := $(SRCS:.cu=.o)
DEPS := $(SRCS:.cu=.d)

PBSRCS := $(wildcard *.proto)
PBOBJS := $(PROTOS:.proto=.pb.o)
PBGENS := $(PROTOS:.proto=.pb.cc) $(PROTOS:.proto=.pb.h)

all: $(BINS)

clean:
rm -f $(BINS) $(OBJS) $(DEPS) $(PBOBJS) $(PBGENS)

$(BINS): $(OBJS)
$(OBJS): $(DEPS)
$(DEPS): $(PBOBJS)

.PRECIOUS: $(PBGENS)

%.d: %.cu
$(CXX) -M $(CXX_FLAGS) $< > $@

%.pb.cc: %.proto
protoc --cpp_out=. $<

%.pb.o : %.pb.cc
$(CXX) $(CXX_FLAGS) -c -o $@ $<

%.o: %.cu
$(CXX) $(CXX_FLAGS) -c -o $@ $<

$(BINS): %: %.o
$(CXX) $(LD_FLAGS) -o $@ $(PROTO_OBJS) $^

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

pkg-config 命令不是必需的,但如果您想自动获取与 protobuf 文件相关的编译和链接标志,该命令会很方便。当然,您必须向此变量添加您自己的标志。

-xc++ 对您来说可能没用,但在这里使用是为了能够使用 .cu 文件并将它们解释为 C++;即使对于不同于 nvcc 的编译器也是如此。

$(DEPS): $(PBOBJS) 指示应在创建依赖项之前创建并编译 protobuf 文件。有多种方法可以实现此目的,因此这只是一个示例。

.PRECIOUS 行指示 make 保留生成的 protobuf 文件。在此示例代码片段中,这些文件被视为中间文件,因此如果没有此行,将被删除。

我将其作为单独的答案发布,因为前一个和这个没有太多共同点。

关于生成文件 w. Protocol Buffer 和自动依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11399983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com