演示结构如下:
.
├── demo
│ ├── include
│ │ └── func.h
│ │
│ └── src
│ ├── BUILD
│ │
│ └── func.cc
└── WORKSPACE
func.h:
#pragma once
int square(int);
func.cc:从根开始包含
#include "demo/include/func.h"
int square(int i) { return i * i; }
已建立:
cc_library(
name = "simple_demo",
srcs = ["func.cc"],
visibility = ["//visibility:public"],
)
WORKSPACE
目录中的Bazel构建命令:
bazel build //demo/src:simple_demo
发生错误。
demo/src/func.cc:1:10: fatal error: 'demo/include/func.h' file not found
我在https://docs.bazel.build/versions/1.1.0/be/c-cpp.html#hdrs
中看到了All header files that are used in the build must be declared in the hdrs or srcs of cc_* rules. This is enforced.
但是,如果我将hdrs = "../include/func.h"
添加到BUILD
,则会发生另一个错误
segment '..' not permitted
答案 0 :(得分:1)
默认情况下,Bazel标签中不允许跨越包装边界。对于您来说,func.h
位于BUILD
文件所定义的程序包之外,该程序包限于demo/src
(及其子文件夹)。
假设您要创建一个库,其中func.h
是从外部可见的公共标头,则可以将文件夹结构更改为:
.
├── demo
│ ├── include
│ │ └── func.h
│ ├── src
│ │ └── func.cc
│ └── BUILD
└── WORKSPACE
和BUILD
文件也包含func.h
:
cc_library(
name = "simple_demo",
hdrs = ["include/func.h"],
srcs = ["src/func.cc"],
visibility = ["//visibility:public"],
)
请注意,即使使用建议的文件夹结构,如果标头不是要包含hdrs = ...
行(或func.h
中也不要包含srcs = ...
),公开),您会因为提到的原因而收到错误消息。
答案 1 :(得分:0)
我不确定这是否行得通,但是您可以尝试提供
'../ include / func.h'
而不是'demo / include / func.h',因为我相信它无法从src文件夹中找到演示文件夹,因为它从那里开始搜索。