c++ - 如何在 bazel 中使用 c++ 外部库
问题描述
我认为这是构建系统的一个相当基本的要求,但不知何故它并不是那么简单——我找到了 2 条信息,但还没有任何运气:
- 所谓官方文档:https ://docs.bazel.build/versions/main/cpp-use-cases.html#adding-dependencies-on-precompiled-libraries ,真的是资料不多
- 参考
cc_import
:https://docs.bazel.build/versions/main/be/c-cpp.html#cc_import,声称“允许用户导入预编译的 C/C++ 库”
但是对于这两种情况,我都看不到指定 的方法path/to/precompiled/lib
,那么假设它应该如何工作?我试图ln
将库文件夹放入 Bazel 工作区,但也没有成功。
如果您能阐明如何在 Bazel 中使用外部依赖项,或者为我指出一个真实的工作示例,我将不胜感激。
解决方案
查看https://github.com/justbuchanan/bazel_rules_qt以了解如何将预编译的 Qt5 版本与 Bazel 一起使用。预编译库的问题在于每个操作系统、编译器(-设置)、平台都需要它们。如果您只针对特定的 OS + 主机编译器和目标平台,那么预编译的库就可以了。
还要考虑使您的第三方库变得笨拙。例如,我为OpenEXR和oneTBB做了这个。我还编写了一些脚本来将 Visual Studio 项目文件转换为 Bazel BUILD 文件。
以下是如何在 Windows 上使用预编译 OpenCV 版本的示例:
WORKSPACE.bazel
:
workspace(name = "OpenCVDemo")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# OpenCV
http_archive(
name = "opencv",
build_file = "//third_party:opencv.BUILD",
strip_prefix = "opencv/build",
# Release
url = "https://github.com/opencv/opencv/releases/download/4.3.0/opencv-4.3.0-dldt-2020.2-vc16-avx2.zip",
)
opencv.BUILD
:
package(default_visibility = ["//visibility:public"])
MAIN_MODULES = [
"core",
"imgproc",
"imgcodecs",
"videoio",
"highgui",
"video",
"calib3d",
"features2d",
"objdetect",
"dnn",
"ml",
"flann",
"photo",
"stitching",
"gapi",
]
# https://stackoverflow.com/questions/56108940/how-to-specify-the-compiler-flags-to-be-used-in-opt-compilation-mode-by-my-own
config_setting(
name = "fastbuild_mode",
values = {"compilation_mode": "fastbuild"},
)
config_setting(
name = "dbg_mode",
values = {"compilation_mode": "dbg"},
)
cc_import(
name = "tbb",
shared_library = select({
":fastbuild_mode": "bin/tbb.dll",
":dbg_mode": "bin/tbb_debug.dll",
"//conditions:default": "bin/tbb.dll",
}),
)
[
(
cc_import(
name = module,
interface_library = select({
":fastbuild_mode": "lib/opencv_{}430.lib".format(module),
":dbg_mode": "lib/opencv_{}430d.lib".format(module),
"//conditions:default": "lib/opencv_{}430.lib".format(module),
}),
shared_library = select({
":fastbuild_mode": "bin/opencv_{}430.dll".format(module),
":dbg_mode": "bin/opencv_{}430d.dll".format(module),
"//conditions:default": "bin/opencv_{}430.dll".format(module),
}),
)
)
for module in MAIN_MODULES
]
cc_library(
name = "opencv",
hdrs = [
"include/opencv2/calib3d.hpp",
"include/opencv2/calib3d/calib3d.hpp",
"include/opencv2/calib3d/calib3d_c.h",
"include/opencv2/core.hpp",
"include/opencv2/core/hal/interface.h",
"include/opencv2/cvconfig.h",
"include/opencv2/dnn.hpp",
"include/opencv2/features2d.hpp",
"include/opencv2/flann.hpp",
"include/opencv2/flann/config.h",
"include/opencv2/flann/defines.h",
"include/opencv2/flann/miniflann.hpp",
"include/opencv2/highgui.hpp",
"include/opencv2/highgui/highgui.hpp",
"include/opencv2/highgui/highgui_c.h",
"include/opencv2/imgcodecs.hpp",
"include/opencv2/imgproc.hpp",
"include/opencv2/ml.hpp",
"include/opencv2/ml/ml.inl.hpp",
"include/opencv2/objdetect.hpp",
"include/opencv2/opencv.hpp",
"include/opencv2/opencv_modules.hpp",
"include/opencv2/photo.hpp",
"include/opencv2/stitching.hpp",
"include/opencv2/video.hpp",
"include/opencv2/video/background_segm.hpp",
"include/opencv2/video/tracking.hpp",
"include/opencv2/videoio.hpp",
"include/opencv2/videoio/videoio_c.h",
],
includes = ["include"],
deps = MAIN_MODULES + [
"tbb",
],
)
BUILD.bazel
:
cc_binary(
name = "OpenCVDemo",
srcs = ["main.cpp"],
deps = ["@opencv"],
)
应该对其他库类似
推荐阅读
- excel - Excel 中 FMI/FMU 的开源工具?
- android - 构建函数返回 null。构建函数绝不能返回 null
- node.js - 如何使用 express node.js ECONNRESET 处理 promise.all
- html - 将导航栏背景从透明更改为黑色
- unity3d - 尝试下载统一的构建器时出现错误
- kubernetes - 在 tekton 管道中使用 knctl/kubectl 将镜像部署到 Knative 服务
- snowflake-cloud-data-platform - 密码重置链接“已过期。请再次提交您的请求;
- azure - 逻辑应用程序-如何从队列中读取批处理消息
- javascript - POST 调用在邮递员中工作正常,但在 node.js 中出现错误
- javascript - A component is changing a controlled input of type of text to be uncontrolled