xamarin-ios绑定上的本地链接错误

Native linking error on xamarin ios binding

本文关键字:链接 错误 绑定 xamarin-ios      更新时间:2023-10-16

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

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

MTOUCH:错误MT5210:本机链接失败,未定义符号:std::locale::classic()。请验证所有必要的框架都已被引用,并且本地库已正确链接。MTOUCH:错误MT5210:本机链接失败,未定义符号:std::__throw_bad_cast()。请验证所有必要的框架都已被引用,并且本地库已正确链接。MTOUCH:错误MT5210:本机链接失败,未定义符号:std::invalid_argument::invalid_argument(std::string const&)。请验证所有必要的框架都已被引用,并且本地库已正确链接。(请在这个完整的日志文件中找到完整的日志。)

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

-ccxx-v-gcc_flags"-L${ProjectDir}-lsdc++-lresolv-liconv-lxml2-lz-OjC-force_load${ProjectDir}/Libs/libcrypto.a"cxx-v-gcc_flags"-L${ProjectDir}-lsdc++-lesolv-liconv-lxml2-lz-ObjC-force_load${Project Dir}/Libs/libssl.a"-cx_v-gcc_flags"-lsdc++-lesolv-liconv-L xml2-lz-OjC-L${项目目录}-framework Security-framework CoreVideo-framework Core Media-framework AVFoundation-framework CFNetwork-framework Accelerate-framework AudioToolbox-framework CoreAudio-framework Foundation-framework CoreGraphics-framework UIKit-force_load${ProjectDir}/Libs/libsipwrapper.a-dad_strip-all_load">

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

根据互联网上的许多文章/帖子,建议添加标准库,如-lsdc++、lz和ObjC,但这似乎对我的情况不起作用。

我还尝试创建了一个绑定项目,其中包括三个库和包装器代码,添加到带有文件的链接中的内容似乎是这样的:

[程序集:LinkWith("libsipwapper.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="-lsdc++-lresolv-liconv-lxml2-lz-OjC")]

问题没有得到解决,我仍然存在所描述的链接错误。

经过两天的浪费时间,我终于得到了它,要明确的是,猜测要传递给触摸的参数,正确链接一个仅由您自己构建的库并不明显。为了简化任务,我编译了SDK提供商提供的演示应用程序,并使用Xcode编译演示,并将Xcode发送的参数发送到clang++。这帮助我计算出要发送到单点触控的参数:

--编译器:clang++-cxx-v-gcc_flags"-stdlib=libstdc++-L${ProjectDir}-force_load${ProjectDir}/Libs/libcrypto.a"-ccxx-v-gcc_flags"-stdlb=libstdc++-L${ProjectDir}-force_lead${Project Dir}-Libs/libssl.a"-cxx/v-gcc_fflags"-dad_strip-lresolv-liconv-stdlb=libstdc++-fokjc-arc-fokjc-link运行时-framework CoreMedia-framework CoreVideo-framework AVFoundation-framework CFNetwork-framework AudioToolbox-framework Core Audio-lz-lxml2-framework CoreGraphics-framework UIKit-framework Foundation-L${ProjectDir}-force_load${ProjectDir}/Libs/libsipwrapper.a">

希望这能帮助其他人。

(检查@NyxSway下面描述的两点也非常重要)

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

1) 你检查过你的.a文件是否真的有它抱怨使用terminal->grep命令的符号吗?对于你支持的所有架构:armv7/armv7s/arm64

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