首页 > 解决方案 > 如何在 bazel 中使用 c++ 外部库

问题描述

我认为这是构建系统的一个相当基本的要求,但不知何故它并不是那么简单——我找到了 2 条信息,但还没有任何运气:

但是对于这两种情况,我都看不到指定 的方法path/to/precompiled/lib,那么假设它应该如何工作?我试图ln将库文件夹放入 Bazel 工作区,但也没有成功。

如果您能阐明如何在 Bazel 中使用外部依赖项,或者为我指出一个真实的工作示例,我将不胜感激。

标签: c++dependenciesbazel

解决方案


查看https://github.com/justbuchanan/bazel_rules_qt以了解如何将预编译的 Qt5 版本与 Bazel 一起使用。预编译库的问题在于每个操作系统、编译器(-设置)、平台都需要它们。如果您只针对特定的 OS + 主机编译器和目标平台,那么预编译的库就可以了。

还要考虑使您的第三方库变得笨拙。例如,我为OpenEXRoneTBB做了这个。我还编写了一些脚本来将 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"],
)

应该对其他库类似


推荐阅读