【问题标题】:How to use c++ external library in bazel如何在 bazel 中使用 c++ 外部库
【发布时间】:2021-10-28 11:37:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ dependencies bazel


    【解决方案1】:

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

    还要考虑使您的第三方库变得笨拙。例如,我为OpenEXRoneTBB 做了这个。我还联合some scripting 将 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"],
    )
    

    应该对其他库类似

    【讨论】:

    • 感谢 Vertexwahn - 仅使用来自 bazel 的 3rd 方库,所有这些似乎都是不必要的,我期待类似于:g++ -I /path/to/precompiled/include -L /path/to/precompiled/lib -lprecompiledlib 所以我只需要指定 2 条路径和 1库名称,它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多