在 iOS 上构建 NewTek NDI 3.0 SDK 时出错

Error when building the NewTek NDI 3.0 SDK on iOS

问题

我正在尝试使用 NDI v3.0 SDK 编译一个 iOS 测试项目,但我 运行 进入 Apple Mach-O 链接器 (ld) 错误。 这是一个静态框架 (libndi_ios.a),你要 link 你的二进制文件,并引用 headers 以便在其中使用它们的 C/C++ API我们的 ObjC++ 代码。

我正在复制他们的示例代码,它只是创建一个 NDIlib_send_instance_t 供使用。一旦我尝试编译此代码,构建就会失败并出现此 linker 错误:

Undefined symbols for architecture armv7:
  "NDI_multicast::send::packetize::~packetize()", referenced from:
      std::__1::__shared_ptr_emplace<NDI_multicast::send::packetize, std::__1::allocator<NDI_multicast::send::packetize> >::~__shared_ptr_emplace() in libndi_ios.a(send_server.o)
      std::__1::__shared_ptr_emplace<NDI_multicast::send::packetize, std::__1::allocator<NDI_multicast::send::packetize> >::~__shared_ptr_emplace() in libndi_ios.a(send_server.o)
      std::__1::__shared_ptr_emplace<NDI_multicast::send::packetize, std::__1::allocator<NDI_multicast::send::packetize> >::__on_zero_shared() in libndi_ios.a(send_server.o)
      NDI_multicast::send::send(NDI_multicast::send::config_multicast_t const&) in libndi_ios.a(NDI_multicast_send.o)
      NDI_multicast::send::send(NDI_multicast::send::config_unicast_t const&) in libndi_ios.a(NDI_multicast_send.o)
      NDI_multicast::send::~send() in libndi_ios.a(NDI_multicast_send.o)
  "NDI_multicast::send::packetize::packetize()", referenced from:
      ndi::reference::send::server::send(ndi::reference::buffer_pack const&, ndi::reference::send::connection*) in libndi_ios.a(send_server.o)
      NDI_multicast::send::send(NDI_multicast::send::config_multicast_t const&) in libndi_ios.a(NDI_multicast_send.o)
      NDI_multicast::send::send(NDI_multicast::send::config_unicast_t const&) in libndi_ios.a(NDI_multicast_send.o)
  "NDI_multicast::send::packetize::operator()(std::__1::function<std::__1::pair<unsigned char const*, unsigned long> (unsigned long, unsigned long)>)", referenced from:
      ndi::reference::send::server::send(ndi::reference::buffer_pack const&, ndi::reference::send::connection*) in libndi_ios.a(send_server.o)
      NDI_multicast::send::operator()(NDI_multicast::send::buffer_source_t&, std::__1::pair<int, int>, std::__1::function<void (bool)>) in libndi_ios.a(NDI_multicast_send.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

正在复制

您可以按照以下步骤重现此错误。我目前正在使用 Xcode 9.4(并且我在最新的测试版上进行了测试,结果相同)

我为得到这个错误所采取的步骤:

  1. 从他们的网站安装 NewTek NDI SDK here
  2. 为单个视图创建新的 Xcode 项目 Objective-C iOS 应用程序
  3. ViewController.m 重命名为 ViewController.mm(因此它被编译为 Objc++)
  4. /NewTek NDI SDK/include 添加到 Header 搜索路径
  5. /NewTek NDI SDK/lib/iOS 添加到库搜索路径
  6. 在"Build Phases"中的"Link Binary With Libraries"下添加libndi_ios.a
  7. 将此代码添加到 ViewController.mm:

    NDIlib_initialize();
    
    NDIlib_send_create_t NDI_send_create_desc;
    NDI_send_create_desc.p_ndi_name = "My Audio";
    NDI_send_create_desc.clock_audio = true;
    
    // (Without this line, everything compiles fine...)
    NDIlib_send_instance_t pNDI_send = NDIlib_send_create(&NDI_send_create_desc);
    

这将失败并出现上述错误。

我发现有趣的一件事是使用他们示例中的其他代码(例如用于接收视频)按预期工作。该问题仅在使用 NDIlib_send_create API.

时存在

有没有人有任何提示或想法可以借鉴?


您可以在他们的网站 here 上请求找到 NewTek iOS SDK。

使用 nariakiiwatani 的 ofxNDI 静态库版本。

https://github.com/nariakiiwatani/ofxNDI/blob/master/libs/NDI/lib/iOS/libndi_ios.a

我用他的静态库版本解决了同样的问题

在就此问题联系 NewTek 的支持人员并链接到此 post 后,他们已经更新(或正在更新)SDK 中包含的库。我相信它很快就会 post 在他们的网站上发布。

感谢 Lightlive.dev 和 emrahgunduz 的建议