使用bazel构建简单库时出现路径问题

时间:2019-11-15 03:02:31

标签: c++ bazel

演示结构如下:

.
├── 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

2 个答案:

答案 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文件夹中找到演示文件夹,因为它从那里开始搜索。