使用OpenCV 3.3依赖项构建Bazel

Bazel build with OpenCV 3.3 dependencies

本文关键字:构建 Bazel 依赖 OpenCV 使用      更新时间:2023-10-16

我正试图使用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",
)

露天电视。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/occv2/frann/flan_base.hpp

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

#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与flan_base.hpp在同一目录中)。

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

#include "opencv2/flann/general.h"

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

所以我的问题是:有没有办法告诉Bazel在这个库中与"当前"文件相同的目录中查找头文件?我查看了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,
)