2

I'm building a simple C++ application on macOS with Bazel. I want to use OpenCV in my application. I installed OpenCV with brew install opencv and I followed Building OpenCV code using Bazel to create my setup.

In my WORKSPACE file, I have:

new_local_repository(
    name = "opencv",
    path = "/usr/local/opt/opencv",
    build_file = "opencv.BUILD",
)

In my opencv.BUILD file, I have:

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.dylib"]),
    hdrs = glob(["include/opencv4/opencv2/**/*.h*"]),
    includes = ["include/opencv4"],
    visibility = ["//visibility:public"],
    linkstatic = 1,
)

In my BUILD file, I have:

cc_library(
    name = "lib",
    srcs = ["hello.cpp"],
    deps = [
        "@opencv//:opencv",
    ],
)

This works as long as the opencv target takes the OpenCV .dlyb files (srcs = glob(["lib/*.dylib"])).

But now I want to build the OpenCV libraries statically into my binary. When I change the opencv target to take OpenCV's .a files (srcs = glob(["lib/*.a"])), I get a bunch of Undefined symbols errors about AVFoundation classes. In my code I use the OpenCV Capture API (which I assume uses AVFoundation under the hood), so this sorta makes sense, but I'm not sure how to fix it.

How should I configure my Bazel targets to build OpenCV statically into my binary?

user18184
  • 488
  • 5
  • 14

0 Answers0