我正在尝试使用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",
)
Run Code Online (Sandbox Code Playgroud)
opencv.BUILD包含:
cc_library(
name = "opencv",
srcs = glob(["lib/*.so*"]),
hdrs = glob(["include/**/*.hpp"]),
includes = ["include"],
visibility = ["//visibility:public"],
linkstatic = 1,
)
Run Code Online (Sandbox Code Playgroud)
我可以在我自己的代码中使用它:
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = [
"@opencv//:opencv"
],
)
Run Code Online (Sandbox Code Playgroud)
但是OpenCV中的一些源文件如下:
/usr/local/include/opencv2/flann/flann_base.hpp
包括来自同一目录的头文件,例如:
#include "general.h"
Run Code Online (Sandbox Code Playgroud)
当我使用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
Run Code Online (Sandbox Code Playgroud)
(general.h与flann_base.hpp位于同一目录中).
如果我将#include指令重写为:
#include "opencv2/flann/general.h"
Run Code Online (Sandbox Code Playgroud)
它汇编得很好.但这不是一个方便的解决方案.
所以我的问题是:有没有办法告诉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,
)
Run Code Online (Sandbox Code Playgroud)