使用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
相关产品推荐
相关产品推荐

