You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rules_foreign_cc通过Bazel构建OpenCV失败求助

使用rules_foreign_cc在Bazel中构建OpenCV的问题与解决

问题背景

我尝试基于Bazel创建C++项目,通过rules_foreign_cc构建OpenCV 4.8.0,但构建始终失败。不过直接使用CMake+Make编译OpenCV时,过程完全正常。

原始配置

WORKSPACE文件

workspace(name = "rules_foreign_cc_usage_example")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# Rule repository, note that it's recommended to use a pinned commit to a released version of the rules
http_archive(
   name = "rules_foreign_cc",
    sha256 = "2a4d07cd64b0719b39a7c12218a3e507672b82a97b98c6a89d38565894cf7c51",
   strip_prefix = "rules_foreign_cc-0.9.0",
   url = "https://github.com/bazelbuild/rules_foreign_cc/archive/refs/tags/0.9.0.tar.gz",
)

load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies")

# This sets up some common toolchains for building targets. For more details, please see
# https://github.com/bazelbuild/rules_foreign_cc/tree/main/docs#rules_foreign_cc_dependencies
rules_foreign_cc_dependencies()

_OPENCV_CONTENT = """\
filegroup(
    name = "all_srcs",
    srcs = glob(["**"]),
    visibility = ["//visibility:public"],
)
"""

http_archive(
    name = "opencv",
    build_file_content = _OPENCV_CONTENT,
    url = "https://github.com/opencv/opencv/archive/refs/tags/4.8.0.tar.gz",
    strip_prefix = "opencv-4.8.0",
)

thirdparty/BUILD.bazel文件

load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")
cmake(
    name = "libopencv",
    generate_args = [
        "-DBUILD_LIST=core,highgui,imgcodecs,imgproc",
        "-DBUILD_ZLIB=OFF",
    ],
    lib_source = "@opencv//:all_srcs",
)

filegroup(
    name = "opencv",
    srcs = [":libopencv"],
    visibility = ["//visibility:public"],
)

构建错误信息

执行命令 bazel build --explain=opencv.log --verbose_explanations //thirdparty:opencv 后,出现如下错误:

INFO: Analyzed target //thirdparty:opencv (49 packages loaded, 15164 targets configured).
INFO: Found 1 target...
INFO: Writing explanation of rebuilds to 'opencv.log'
ERROR: /Users/name/Code/Git/AimTracker/C/thirdparty/BUILD.bazel:2:6: output 'thirdparty/libopencv/lib/libopencv.a' was not created
ERROR: /Users/name/Code/Git/AimTracker/C/thirdparty/BUILD.bazel:2:6: Foreign Cc - CMake: Building libopencv failed: not all outputs were created or valid
Target //thirdparty:opencv failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 292.206s, Critical Path: 290.73s
INFO: 7 processes: 5 internal, 2 darwin-sandbox.
FAILED: Build did NOT complete successfully

直接用CMake编译则可正常完成:

cmake -DBUILD_ZLIB=OFF -DBUILD_LIST=core,highgui,imgcodecs,imgproc ..
make

针对Mac系统的修正配置

参考解决方案后,更新thirdparty/BUILD.bazel配置如下,已可正常构建:

load("@rules_cc//cc:defs.bzl", "cc_library")
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")
cc_library(
    name = "opencv_deps",
    linkopts = [
        "-ldl", 
        "-lz", 
        "-lpthread",
        "-lavutil",
        "-lavformat", 
        "-lavcodec", 
        "-lswscale", 
        "-L/opt/homebrew/opt/ffmpeg/lib", 
        "-L/opt/homebrew/Cellar/libx11/1.8.6/lib", 
        "-framework Cocoa",
        "-framework Accelerate",
    ],
)

cmake(
    name = "opencv",
    build_args = [
        "-j16",
    ],
    cache_entries = {
        "OPENCV_FORCE_3RDPARTY_BUILD": "ON",
        "BUILD_SHARED_LIBS": "OFF",
        "BUILD_TESTS": "OFF",
        "BUILD_PERF_TESTS": "OFF",
        "BUILD_opencv_apps": "OFF",
        "BUILD_opencv_calib3d": "OFF",
        "BUILD_opencv_core": "ON",
        "BUILD_opencv_dnn": "OFF",
        "BUILD_opencv_features2d": "OFF",
        "BUILD_opencv_flann": "OFF",
        "BUILD_opencv_gapi": "OFF",
        "BUILD_opencv_highgui": "ON",
        "BUILD_opencv_imgcodecs": "ON",
        "BUILD_opencv_imgproc": "ON",
        "BUILD_opencv_java_bindings_generator": "OFF",
        "BUILD_opencv_js": "OFF",
        "BUILD_opencv_ml": "OFF",
        "BUILD_opencv_objdetect": "OFF",
        "BUILD_opencv_photo": "OFF",
        "BUILD_opencv_python_bindings_generator": "OFF",
        "BUILD_opencv_stitching": "OFF",
        "BUILD_opencv_ts": "OFF",
        "BUILD_opencv_video": "OFF",
        "BUILD_opencv_videoio": "ON",
        "BUILD_opencv_world": "ON",
        "BUILD_IPP_IW": "ON",
        "WITH_ADE": "OFF",
        "WITH_CAROTENE": "OFF",
        "WITH_IPP": "OFF",
        "WITH_ITT": "ON",
        "WITH_OPENEXR": "OFF",
        "WITH_JASPER": "OFF",
        "WITH_JPEG": "OFF",
        "WITH_OPENJPEG": "ON",
        "WITH_TIFF": "OFF",
        "WITH_WEBP": "ON",
        "WITH_QUIRC": "ON",
        "WITH_GTK": "OFF",
        "WITH_OPENBLAS": "ON",
        "WITH_OPENCL": "OFF",
    },
    env = {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_BUILD_PARALLEL_LEVEL": "16",
    },
    lib_source = "@opencv//:all",
    out_include_dir = "include/opencv4",
    out_static_libs = [
        "libopencv_world.a",
        "opencv4/3rdparty/libittnotify.a",
        "opencv4/3rdparty/liblibopenjp2.a",
        "opencv4/3rdparty/liblibwebp.a",
        "opencv4/3rdparty/liblibpng.a",
    ],
    targets = [
        "install",
    ],
    visibility = ["//visibility:public"],
    deps = [":opencv_deps"],
)

内容的提问来源于stack exchange,提问作者El_Loco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:42:33