MediaPipe 库在 macOS 上构建

Gab*_*bor 6 macos shared-libraries static-libraries bazel

我正在尝试在 macOS 上将 MediaPipe 构建为库,以便能够在带有 CMake 的桌面项目中使用它,但我遇到了问题。我正在尝试将 Hello World 示例转换为库,使用hello_world.ccMediaPipe 作为外部库。我也尝试过静态和动态库构建,但我都遇到了问题。

目前我陷入困境,任何帮助将不胜感激。

构建库的步骤和收到的错误如下:

  1. 作为静态库

    • mediapipe/lib/BUILD我创建了一个包含以下内容的文件
apple_static_library(
    name = "mediapipe",
    minimum_os_version = "10.14",
    platform_type = "macos",
    deps = [
        "//mediapipe/calculators/core:pass_through_calculator",
        "//mediapipe/framework:calculator_graph",
        "//mediapipe/framework/port:logging",
        "//mediapipe/framework/port:parse_text_proto",
        "//mediapipe/framework/port:status",
    ],
)
Run Code Online (Sandbox Code Playgroud)
  • 构建了库
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/lib:mediapipe
Run Code Online (Sandbox Code Playgroud)
  • 复制bazel-out/apl-darwin_x86_64-opt/bin/mediapipe/lib/mediapipe_lipo.a到我的桌面项目

  • 项目已经构建没有错误,但是运行时出现以下错误:

Not found: ValidatedGraphConfig Initialization failed.
No registered object with name: PassThroughCalculator; Unable to find Calculator "PassThroughCalculator"
No registered object with name: PassThroughCalculator; Unable to find Calculator "PassThroughCalculator"
Run Code Online (Sandbox Code Playgroud)
  1. 作为动态库

我读到一些github问题,构建iOS动态库不会出现上述问题。

  • Bazel 构建文件mediapipe/dylib/BUILD包含以下内容
load("@build_bazel_rules_apple//apple:macos.bzl", "macos_dylib")

macos_dylib(
    name = "mediapipe",
    minimum_os_version = "10.15",
    deps = [
        "//mediapipe/framework:calculator_framework",
        "//mediapipe/framework/port:commandlineflags",
        "//mediapipe/framework/port:file_helpers",
        "//mediapipe/framework/port:map_util",
        "//mediapipe/framework/port:parse_text_proto",
        "//mediapipe/framework/port:ret_check",
        "//mediapipe/framework/port:status",
        "//mediapipe/framework/port:statusor",
        "@com_google_absl//absl/strings",
        #"//mediapipe/graphs/hand_tracking:desktop_tflite_calculators",
        "//mediapipe/calculators/core:pass_through_calculator",
    ],
)
Run Code Online (Sandbox Code Playgroud)
  • 构建了 dylib
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/dylib:mediapipe
Run Code Online (Sandbox Code Playgroud)
  • 修复了 dylib id
chmod 755 mediapipe.dylib
install_name_tool -id mediapipe.dylib mediapipe.dylib
Run Code Online (Sandbox Code Playgroud)
  • 复制bazel-bin/mediapipe/dylib/mediapipe.dylib到我的项目中

  • 在构建过程中我遇到链接错误:

Undefined symbols for architecture x86_64:
  "mediapipe::CalculatorGraph::Initialize(mediapipe::CalculatorGraphConfig const&)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
      MediaPipeApp::setup() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::WaitUntilDone()", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::CloseInputStream(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::AddOutputStreamPoller(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::AddPacketToInputStream(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, mediapipe::Packet&&)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::StartRun(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mediapipe::Packet, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mediapipe::Packet> > > const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mediapipe::Packet, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mediapipe::Packet> > > const&)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::CalculatorGraph()", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
      MediaPipeApp::setup() in MediaPipeApp.cpp.o
  "mediapipe::CalculatorGraph::~CalculatorGraph()", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
      MediaPipeApp::setup() in MediaPipeApp.cpp.o
  "mediapipe::internal::OutputStreamPollerImpl::Next(mediapipe::Packet*)", referenced from:
      mediapipe::PrintHelloWorld() in MediaPipeApp.cpp.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

小智 0

尝试使用 xcode 11 beta 4 或更高版本。Apple 将 swift 库移至“swift-5.0”目录中,因此 tulsi 无法构建。解决方法是将库从“swift-5.0”软链接到“swift”目录,然后重新运行构建过程。请参阅https://forums.developer.apple.com/thread/120074