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,
)
我正在尝试使用 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,
)