加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何解决bazel“unclared inclusion(s)”错误?

发布时间:2020-12-16 10:06:26 所属栏目:百科 来源:网络整理
导读:我是bazel的新手,而且我没有用它来构建我的C包 ERROR: /path/to/package/BUILD:linenumber:1 undeclared inclusion(s) in rule ‘//path/to/package:name’: this rule is missing dependency declarations for the following files included by ‘path/to/p
我是bazel的新手,而且我没有用它来构建我的C包

ERROR: /path/to/package/BUILD:linenumber:1 undeclared inclusion(s) in rule ‘//path/to/package:name’:
this rule is missing dependency declarations for the following files included by ‘path/to/package/source_file.cpp’

…后面是不同目录中的头文件列表.这些文件不是正在构建的包的一部分,而是从其他地方引入的.

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

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

srcs = [ ...,"path/to/dependent/headers/header.h",]

我收到一条错误消息

ERROR: … crosses boundary of subpackage … (perhaps you meant to
put the colon here: …?)

因为带有标题的目录不是Bazel包.

如果我尝试将最终/更改为冒号,则会显示错误消息,"path/to/dependent/headers:header.h",]

然后

ERROR: … target names may not contain ‘:’.

Bazel C教程here,在“Additonal Include Paths”部分中说,外部包含目录应该通过copts声明:

cc_library(
    name = "some_lib",srcs = ["some_lib.cc"],hdrs = ["some_lib.h"],copts = ["-Ithird_party/some_lib"],)

但添加-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

解决方法

Bazel希望你依赖标题(即把它们放在deps中).基本上,您应该为这些标题创建cc_library.将标题放在hdrs中并不公开它们,它只是将它们暴露给依赖于该库的规则(这正是你想要的).所以你会有:

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

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

然后在目标的deps中添加// third_party / some_lib:标头.

这些小报仅用于修改C的标题搜索路径,而不是Bazel的. Bazel总是假设你会做#include“path / relative / to / your / workspace / dir.h”,但如果你有一个像这样的来源:

#include "foo.h"

其中foo.h位于third_party / some_lib / includes / foo.h,您可以说copts = [“ – Iird_party / some_lib / includes”]将其添加到C的标题搜索路径中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读