首页 > 解决方案 > 在 iOS 上构建 NewTek NDI 3.0 SDK 时出错

问题描述

问题

我正在尝试使用 NDI v3.0 SDK 编译一个 iOS 测试项目,但我遇到了 Apple Mach-O Linker (ld) 错误。libndi_ios.a它是一个静态框架(

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

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(我已经在最新的 beta 上进行了测试,结果相同)

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

  1. 在此处从他们的网站安装 NewTek NDI SDK
  2. 为单视图 Objective-C iOS 应用程序创建一个新的 Xcode 项目
  3. 重命名ViewController.mViewController.mm(所以编译为 Objc++)
  4. 添加/NewTek NDI SDK/include到标题搜索路径
  5. 添加/NewTek NDI SDK/lib/iOS到库搜索路径
  6. libndi_ios.a在“Build Phases”中的“Link Binary With Libraries”下添加。
  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_createAPI 时存在。

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


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

标签: iosobjective-cobjective-c++

解决方案


使用 nariakiiwatani 的 ofxNDI 静态库版本。

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

我通过他的静态库版本解决了同样的问题。


推荐阅读