如何解决bazel“未声明的包含”错误?

Die*_*nte 5 c++ bazel

我是bazel的新手,并且无法使用以下命令构建C ++程序包

错误:/ path / to / package / BUILD:linenumber:1规则'// path / to / package:name'中未声明包含:此规则缺少'path / to / package / source_file.cpp'

...之后是其他目录中的头文件列表。这些文件不是正在生成的程序包的一部分,而是从其他位置拉入的。

我的问题是如何将声明正确添加到BUILD文件中以解决错误?

根据在线Bazel文档我应该将每个标头添加到srcs列表中。(要清楚,这些是我正在构建的库在内部使用的标头,而不是公共接口的一部分,因此它们不属于hdrs。)但是,如果我尝试这样做,

  srcs = [ ..., "path/to/dependent/headers/header.h",]
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息

错误:...跨越子包的边界...(也许您打算将冒号放在此处:...?)

因为带有标题的目录不是Bazel软件包。

如果我按照错误消息的提示尝试将final /更改为冒号,

  srcs = [ ..., "path/to/dependent/headers:header.h",]
Run Code Online (Sandbox Code Playgroud)

然后

错误:目标名称不能包含“:”。

该巴泽尔C ++教程这里,在一节“产生额外包括路径”说,外界包括目录应该通过声明科普特人

cc_library(
    name = "some_lib",
    srcs = ["some_lib.cc"],
    hdrs = ["some_lib.h"],
    copts = ["-Ithird_party/some_lib"],
)
Run Code Online (Sandbox Code Playgroud)

但是添加-I标志并不能消除“未声明的包含”错误!

$ bazel version
Build label: 0.4.3
Build target: bazel-out/local-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Thu Dec 22 12:31:25 2016 (1482409885)
Build timestamp: 1482409885
Build timestamp as int: 1482409885
Run Code Online (Sandbox Code Playgroud)

小智 8

我遇到了类似的问题“规则中未声明包含”,我通过删除/root/.cache/bazel/中的bazel缓存文件来解决。希望有所帮助

  • 谢谢,我有一段时间没有使用它了,它在缓存中...... (2认同)

kri*_*ina 6

Bazel 希望您依赖标头(即,将它们放入deps)。基本上,您应该为这些标头创建一个 cc_library。放入标头hdrs不会公开公开它们,它只是将它们公开给依赖于该库的规则(这正是您想要的)。所以你将拥有:

# third_party/some_lib/BUILD
cc_library(
    name = "headers",
    hdrs = glob(["*.h"]),
    visibility = ["//path/to/package:__pkg__"],
)
Run Code Online (Sandbox Code Playgroud)

请注意,您应该将 //path/to/package 替换为实际目标的包,但上面__pkg__是字面意思:这就是您指示“对该包可见”的方式。然后其他包就无法访问这些标头。

然后添加//third_party/some_lib:headers您的目标的deps.

它们copts仅用于修改 C++ 的标头搜索路径,而不是 Bazel 的。Bazel 总是假设你会这样做#include "path/relative/to/your/workspace/dir.h",但如果你有这样的来源:

#include "foo.h"
Run Code Online (Sandbox Code Playgroud)

其中foo.h位于third_party/some_lib/includes/foo.h,您可以说copts = ["-Ithird_party/some_lib/includes"]将其添加到C++的标头搜索路径中。