最近在用Utube-8M的mediapipe框架提取视频特征,用到了bazel编译,遇到一些问题做一些总结。
WORKSPACE
WORKSPACE位于你的项目根目录,标志你的工作区。用于引入外部依赖关系,通常是源代码位于主存储库之外。
BUILD文件
BUILD文件给出了编译目标的规则,包括target名称,源文件srcs,头文件hdrs,依赖deps
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
hdrs = ["hello-world.hpp",
"helo.hpp",
],
deps = ["//lib:hello-time"]
)
具体规则可以参考源网站https://docs.bazel.build/versions/master/be/c-cpp.html#cc_binary
deps
依赖可以包含内部依赖也可以包含外部依赖,
内部依赖这里的路径是以WORKSPACE的路径开始的相对路径,例如deps = ["//lib:hello-time"]代表WORKSPACE路径下有lib文件夹,lib里面有hello-time.cc,并且有BUILD文件,这个就是内部依赖,还没有编译,在你编译主文件时他会自动链接先编译这个文件。
外部依赖就是可以调用你安装好的包,比如opencv包,这时你需要先改WORKSPACE加入环境,再写一个BUILD调用。
1、WORKSPACE加入环境,它指定了名字,path就是环境遍历,build_file就是build的文件再third_party文件夹下opencv_linux.BUILD中。
new_local_repository(
name = "linux_opencv",
build_file = "@//third_party:opencv_linux.BUILD",
path = "/home/menglingjun/menglingjun/software/opencv",
)
2、改opencv_linux.BUILD
加入源文件,头文件,include啥的,都是相对于你前面的path
cc_library(
name = "opencv",
srcs = glob(
[
"lib64/libopencv_core.so",
"lib64/libopencv_highgui.so",
"lib64/libopencv_imgcodecs.so",
"lib64/libopencv_imgproc.so",
"lib64/libopencv_video.so",
"lib64/libopencv_videoio.so",
],
),
hdrs = glob(
[
"include/opencv4/opencv2/**/*.h*",
"include/opencv4/opencv2/*.h*",
]),
includes = ["include/opencv4",], # ["include"],
linkstatic = 1,
visibility = ["//visibility:public"],
)
3、你要编译的目标如何依赖
把opencv加上就可以了。
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
hdrs = ["hello-world.hpp",
"helo.hpp",
],
deps = ["//third_party:opencv"]
)
编译文件
Test 1编译单独一个目标
在你的WORKSPACE所在目录下运行bazel build,运行main文件夹下的hello-world.cc
stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
bazel build //main:hello-world
Test 2编译带有依赖的目标
如果hello-world.cc的文件需要调用hello-greet的包此时就需要加入deps依赖。build文件如下所示
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
],
)
这样再编译hello-world,bazel就会首先编译hello-greet再对hello-world.cc进行编译。指令我们还是一样
bazel build //main:hello-world