【发布时间】:2018-06-25 13:37:36
【问题描述】:
我正在尝试使用 Bazel 构建一个使用 Flatbuffers 的 cpp 项目。
但是我用flatc生成的map_schema_generated.h没有找到。
我的树:
|
|_ data
| |_ maps
| |_ BUILD
| |_ map_schema.fbs
|
|_ src
| |_ map
| |_ BUILD
| |_ map.hpp
| |_ map.cpp
|
|_ tools
| |_ BUILD
| |_ generate_fbs.bzl
|
|_ WORKSPACE
tools/generate_fbs.bzl:
def _impl(ctx):
output = ctx.outputs.out
input = ctx.files.srcs
print("generating", output.basename)
ctx.action(
use_default_shell_env = True,
outputs = [output],
inputs = input,
progress_message="Generating %s with %s" % (output.path, input[0].path),
command="flatc -o %s --cpp %s" % (output.dirname, input[0].path)
)
generate_fbs = rule(
implementation=_impl,
output_to_genfiles = True,
attrs={
"srcs": attr.label_list(allow_files=True, allow_empty=False),
"out": attr.output()
},
)
data/maps/BUILD:
load("//tools:generate_fbs.bzl", "generate_fbs")
generate_fbs(
name = "schema",
srcs = ["map_schema.fbs"],
out = "map_schema_generated.h",
visibility = ["//visibility:public"]
)
src/map/BUILD:
cc_library(
name = "map",
srcs = [
"//data/maps:map_schema_generated.h",
"map.hpp",
"map.cpp"
]
)
src/map/map.cc 拥有#include "map_schema_generated.h"。
我用来构建的命令行:bazel build //src/map。
如果我在bazel-* 中find,我得到:
bazel-genfiles/data/maps/map_schema_generated.h
bazel-out/k8-fastbuild/genfiles/data/maps/map_schema_generated.h
bazel-my-workspace-name/bazel-out/k8-fastbuild/genfiles/data/maps/map_schema_generated.h
如果我cat这些文件,我可以看到它们生成良好。
我找到的所有信息都是关于Tensorflow,并没有真正的帮助。
最好的问候,
【问题讨论】:
-
对 Bazel 不是很熟悉,但是考虑到它会构建和生成文件,问题一定是你的
cc_library将标头定义为依赖项,但没有将其指定为包含 /包括目录。我会看看是否有办法查看生成的编译器命令行,如果那里没有生成文件目录的-I,那么这就是你的问题。 -
Ok
bazel build -s //src/map打印编译器选项。-I不见了。所以我将copts = ["-I$(GENDIR)/data/maps"]添加到src/map/BUILD中,它可以工作。谢谢你的建议。 (但我认为这不是好方法)
标签: c++ bazel flatbuffers