我是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缓存文件来解决。希望有所帮助
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++的标头搜索路径中。
| 归档时间: |
|
| 查看次数: |
4466 次 |
| 最近记录: |