【问题标题】:Xamarin.iOS native linking error MTOUCH MT5210 undefined symbol std::stringXamarin.iOS 本机链接错误 MTOUCH MT5210 未定义符号 std::string
【发布时间】:2020-05-20 01:47:18
【问题描述】:

我的 Xamarion.iOS 绑定项目具有指向所有必需的本机视频 SDK 库和本机 OS 框架的链接。我已经使用 Frameworks 属性设置了所需的框架。其他设置包括 SmartLink=true、ForceLoad=true、IsCxx=true、LinkerFlags="-lc++"。它可以内置到 C# DLL 中。在 iOS 项目中,DLL 被引用和使用。但是存在本地链接错误。

MTOUCH: Error MT5210: Native linking failed, undefined symbol: std::string::_Rep::_M_destroy(std::allocator<char> const&). Please verify that all the necessary frameworks have been referenced and native libraries are properly linked in. 

构建日志中的详细信息:

> Undefined symbols for architecture arm64:
>       "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
>           HPR_UTF82A(char const*) in libHCCore.a(HPR_Utils.o)
>           HPR_A2UTF8(char const*) in libHCCore.a(HPR_Utils.o)
>       "std::string::_Rep::_S_empty_rep_storage", referenced from:
>           HPR_UTF82A(char const*) in libHCCore.a(HPR_Utils.o)
>           HPR_A2UTF8(char const*) in libHCCore.a(HPR_Utils.o)
>       "std::string::assign(char const*, unsigned long)", referenced from:
>           HPR_UTF82A(char const*) in libHCCore.a(HPR_Utils.o)
>           HPR_A2UTF8(char const*) in libHCCore.a(HPR_Utils.o)
>       "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char>
> const&)", referenced from:
>           HPR_A2UTF8(char const*) in libHCCore.a(HPR_Utils.o)
>       "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced
> from:
>           HPR_A2UTF8(char const*) in libHCCore.a(HPR_Utils.o)
>     ld: symbol(s) not found for architecture arm64
>     clang : error : linker command failed with exit code 1 (use -v to see invocation)

换行错误:

MTOUCH: Warning MT5215: References to 'System' might require additional -framework=XXX or -lXXX instructions to the native linker (MT5215)

Error MT5201: Native linking failed. Please review the build log and the user flags provided to gcc: -ObjC (MT5201)

MTOUCH: Error MT5202: Native linking failed. Please review the build log. (MT5202)

clang: Error: linker command failed with exit code 1 (use -v to see invocation)

请解释一下。谢谢。

Xcode 中没有这样的本机链接错误。构建设置:

【问题讨论】:

  • 代码中没有本机链接错误。 Xcode 中的设置(来自构建日志):
  • /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c++ -target armv7-apple-ios8.0 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -stdlib=libc++
  • Xcode: -Xlinker -no_deduplicate -stdlib=libc++ -fobjc-link-runtime -liconv -lssl -lAudioEngine_64 -lplayctrl -lSystemTransform -framework QuartzCore -framework CoreVideo -framework CoreMedia -framework GLKit -framework VideoToolbox -框架 AudioToolbox -framework Foundation -framework UIKit -lHCNetSDK -lHCCore -lcrypto -framework CoreGraphics -framework OpenGLES -framework CoreGraphics -framework OpenAL
  • 我已将 Xcode 升级到 11.5,并将 Visual Studio for Mac 升级到 8.6 build 4520。在 iOS 构建项目设置中将链接器行为设置为 Link All。本机链接错误消失了,但是链接全部引起了一个新问题。我们不能再使用 DependencyService。 iOS 应用将无法加载,因为 DependencyService 甚至无法解析带有 Null 引用的 IFileHelper 的第一个平台实现。
  • 这看起来像一个 Xamarin 错误,请参阅 stackoverflow.com/questions/61757404/…。我已经尝试了 Additional mtouch arguments --linkskip tecommobile 以及docs.microsoft.com/en-us/xamarin/ios/deploy-test/… 中的其他一些方法。我无法解决问题。

标签: dependency-injection xamarin.ios linker native static-linking


【解决方案1】:

托管链接和本机链接可能会删除代码。 Link All 可能会删除更多代码。所以需要解决问题,而不是使用 Link All 使问题消失。使用 Link All 时,需要使用 Preserve 属性来保存代码。

我添加了所有本地引用,正确设置了链接选项。我还设置了链接器标志以正确包含所有必需的 OS 平台框架。添加对原生动态框架的引用后,错误消失了。然后,我没有得到未定义的符号,而是得到了重复的符号。我不得不删除对本机库的引用。

虽然iOS项目是在引用动态框架后链接构建的,但存在运行时问题。我们的 SDK 提供商确认我们不能使用他们的动态框架。为 Xcode 中不同目标 SimpleDemo_Dy 的其他客户提供动态框架。它们是旧版本的 SDK。我们应该只使用静态库。

我重新检查了 Xcode 构建日志。 Xcode 中的目标 SimpleDemo 没有使用动态框架。问题是为什么 Xcode 项目在不使用任何动态框架的情况下构建,但 Visual Studio for Mac 构建失败并出现本机链接错误?

我创建了一个仅使用静态库的示例 iOS 应用。它构建并运行正常。我已经与您分享了示例 iOS 应用程序。链接是https://drive.google.com/file/d/10QXkaZE7lURN6IF96NIrTGY2lmn88ctF/view?usp=sharing

我无法在我们的产品应用中使用相同的绑定项目设置实现相同的效果。我什至尝试从示例应用程序中交换绑定项目。它没有帮助。我还比较了来自项目选项 UI 和 WinMerge 的 iOS 项目设置。我仍然找不到问题所在。我已经尝试过多次清理和重建。我试图签出一个新的工作区。它仍然有未定义的符号错误。

我认为问题在于其中一个本地库 libHCCore.a 是用 libstdc++ 编译的,这导致了错误 undefined symbol std::string 而其余的是 libc++。

将链接器标志 -lstdc++ 添加到本机引用没有帮助。如何在 iOS 项目中使用额外的 Mtouch 参数或在绑定项目中使用额外的 btouch 参数来解决问题?

【讨论】:

    【解决方案2】:

    https://github.com/xamarin/xamarin-macios/issues/8669

    我们了解到,我们的 iOS 应用程序的问题是由我们供应商 SDK 的 libstdc++ 和 libc++ 库混合引起的。他们的 libHCCore.a 是用 libstdc++ 编译的,而其余的都是用 libc++ 编译的。我在 Visual Studio for Mac 中尝试了其他链接选项,但由于“不推荐使用 libstdc++”和“找不到库 –lstdc++”而失败。以下是 Microsoft Sebastien Pouliot 的建议:

    我认为问题在于其中一个本地库 libHCCore.a 是使用 libstdc++ 编译的,它导致错误未定义符号 std::string 而其余的是 libc++。 你不能把两者混在一起。 Xcode 8 已弃用使用 libstdc++ 构建,并且在针对 iOS 时,Xcode 10 不支持此功能。 C++ 项目现在必须迁移到 libc++,并且建议将部署目标设置为 macOS 10.9 或更高版本,或者 iOS 7 或更高版本。 ... 项目依赖项(例如针对 libstdc++ 构建的静态档案)也需要针对 libc++ 重新构建。 https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes?language=objc 您需要与您的供应商交谈以获取针对 libc++ 构建的更新 请用 libc++ 重建 libHCCore.a。

    此问题已通过我们的供应商使用 libc++ 重建 libHCCore.a 得到解决。

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2018-06-24
      • 2023-02-14
      • 2012-05-08
      • 2021-03-07
      相关资源
      最近更新 更多