Bazel 使用 OpenCV 3.3 依赖项构建

Bazel build with OpenCV 3.3 dependencies

我正在尝试使用 Bazel 来编译和分发基于 OpenCV 的 C++ 代码,但我遇到了一个我无法解决的问题。

我在 Ubuntu 16.04 LTS 上从源构建和安装 OpenCV 3.3,支持 CUDA (CUDA 8)。我安装在标准目录/usr/local.

鉴于此,我使用这个 WORKSPACE 文件创建了我的项目:

new_local_repository(
    name = "opencv",
    path = "/usr/local",
    build_file = "opencv.BUILD",
)

opencv.BUILD 包含:

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp"]),
    includes = ["include"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)

我可以在自己的代码中使用它:

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [
        "@opencv//:opencv"
    ],
)

但 OpenCV 中的一些源文件,如:

/usr/local/include/opencv2/flann/flann_base.hpp

包括来自同一目录的 headers 文件,例如:

#include "general.h"

当我使用 Bazel 构建时,出现此错误:

ERROR: /home/damien/main/BUILD:1:1: C++ compilation of rule '//main:main' failed (Exit 1)
In file included from external/opencv/include/opencv2/flann.hpp:48:0,
                 from external/opencv/include/opencv2/opencv.hpp:62,
                 from main/main.cc:1:
external/opencv/include/opencv2/flann/flann_base.hpp:38:21: fatal error: general.h: No such file or directory

(general.h 与 flann_base.hpp 在同一目录)。

如果我将#include 指令重写为:

#include "opencv2/flann/general.h"

它编译得很好。但这不是一个方便的解决方案。

所以我的问题是:有没有办法告诉 Bazel 在与此库中的 "current" 文件相同的目录中查找 headers?我查看了 Bazel 的每个 C++ 指令,但我没有看到任何实现它的方法。

提前致谢。

好吧,真丢人。我必须导入 *.h :

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp", "include/**/*.h"]),
    includes = ["include"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)

在我使用 opencv4 和 Damien 设置的情况下,我在包含 highgui.hpp:

时遇到错误
 external/opencv/include/opencv4/opencv2/highgui.hpp:46:10: fatal
 error: opencv2/core.hpp: No such file or directory  #include
 "opencv2/core.hpp"

我可以修复它调整包括添加 opencv4:

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp", "include/**/*.h"]),
    includes = ["include/opencv4"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)