xamarin ios 绑定上的本机链接错误

Native linking error on xamarin ios binding

我正在使用 P/Invoke 编写绑定到 iOS SDK 的包装器,因为 Sharpie 无法为此 SDK 生成可编译代码。

在使用引用的包装器项目编译 iOS 应用程序时,我遇到许多链接问题,例如这个:

MTOUCH: error MT5210: Native linking failed, undefined symbol: std::locale::classic(). Please verify that all the necessary frameworks have been referenced and native libraries are properly linked in. MTOUCH: error MT5210: Native linking failed, undefined symbol: std::__throw_bad_cast(). Please verify that all the necessary frameworks have been referenced and native libraries are properly linked in. MTOUCH: error MT5210: Native linking failed, undefined symbol: std::invalid_argument::invalid_argument(std::string const&). Please verify that all the necessary frameworks have been referenced and native libraries are properly linked in. (Please find the complete log on this complete log file.)

从 iOS 项目传递的额外单声道触摸参数如下所述:

-cxx -v -gcc_flags "-L${ProjectDir} -lstdc++ -lresolv -liconv -lxml2 -lz -ObjC -force_load ${ProjectDir}/Libs/libcrypto.a" -cxx -v -gcc_flags "-L${ProjectDir} -lstdc++ -lresolv -liconv -lxml2 -lz -ObjC -force_load ${ProjectDir}/Libs/libssl.a" -cxx -v -gcc_flags "-lstdc++ -lresolv -liconv -lxml2 -lz -ObjC -L${ProjectDir} -framework Security -framework CoreVideo -framework CoreMedia -framework AVFoundation -framework CFNetwork -framework Accelerate -framework AudioToolbox -framework CoreAudio -framework Foundation -framework CoreGraphics -framework UIKit -force_load ${ProjectDir}/Libs/libsipwrapper.a -dead_strip -all_load"

SDK 由三个库组成:libcrypto.a、libssl.a 和 libsipwrapper.a。

网上很多articles/posts,建议添加-lstdc++、lz、ObjC等标准库,但我的情况好像不行

我也试过创建一个包含三个库和包装代码的绑定项目,添加到 linkwith 文件的内容看起来是这样的:

[assembly: LinkWith ("libsipwrapper.a", LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Arm64, Frameworks = "CoreVideo CoreMedia AVFoundation CFNetwork Accelerate AudioToolbox CoreAudio Foundation CoreGraphics UIKit", ForceLoad = false, SmartLink = true, IsCxx = true, LinkerFlags = "-lstdc++ -lresolv -liconv -lxml2 -lz -ObjC")]

问题没有解决,我仍然遇到描述的链接错误。

在不了解您项目的更多细节的情况下,您是否检查过:

1) 你有没有检查过你的 .a 文件是否真的有那个符号,它抱怨使用终端 -> grep 命令,对于你支持的所有体系结构:armv7/armv7s/arm64

2) 在您的 C# 代码中,您是否使用了 [DllImport ("__Internal")] 而不是您自己的库名称?

经过两天的浪费时间,我终于明白了,要清楚,猜测传递给 touch 的参数并不明显,link 正确地一个由你自己构建的层的库。为了简化任务,我编译了SDK提供商提供的演示应用程序,并使用Xcode编译演示并获取Xcode发送给clang++的参数。这帮助我找出了发送到 monotouch 的参数:

--compiler:clang++ -cxx -v -gcc_flags "-stdlib=libstdc++ -L${ProjectDir} -force_load ${ProjectDir}/Libs/libcrypto.a" -cxx -v -gcc_flags "-stdlib=libstdc++ -L${ProjectDir} -force_load ${ProjectDir}/Libs/libssl.a" -cxx -v -gcc_flags "-dead_strip -lresolv -liconv -stdlib=libstdc++ -fobjc-arc -fobjc-link-runtime -framework CoreMedia -framework CoreVideo -framework AVFoundation -framework CFNetwork -framework AudioToolbox -framework CoreAudio -lz -lxml2 -framework CoreGraphics -framework UIKit -framework Foundation -L${ProjectDir} -force_load ${ProjectDir}/Libs/libsipwrapper.a"

希望这对其他人有所帮助。

(查看下面@NyxSway描述的两点也很重要)