xamarin ios绑定的原生链接错误

时间:2016-06-07 13:50:09

标签: c++ ios xamarin linker xamarin.ios-binding

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

在使用引用的包装器项目编译iOS App时,我遇到了许多链接问题,例如:

  

MTOUCH:错误MT5210:本机链接失败,未定义符号:std :: locale :: classic()。请验证是否已引用所有必需的框架,并且本机库已正确链接。   MTOUCH:错误MT5210:本机链接失败,未定义符号:std :: __ throw_bad_cast()。请验证是否已引用所有必需的框架,并且本机库已正确链接。   MTOUCH:错误MT5210:本机链接失败,未定义符号:std :: invalid_argument :: invalid_argument(std :: string const&)。请验证是否已引用所有必需的框架并且已正确链接本机库。(请在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。

在互联网上发表很多文章/帖子后,建议添加标准库,如-lstdc ++,lz和ObjC,但这似乎不适用于我的情况。

我还尝试创建一个包含三个库和包装器代码的Binding项目,添加到linkwith文件的内容如下所示:

  

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

问题没有解决,我继续有所描述的链接错误。

2 个答案:

答案 0 :(得分:2)

经过两天的浪费时间后,我终于明白了,很明显,猜测要传递给触摸的参数是不明显的,只能由你自己正确链接一个由图层构建的库。为了简化任务,我编译了SDK提供程序提供的演示应用程序,并使用Xcode编译演示并获取Xcode发送给clang ++的参数。这有助于我找出发送到monotouch的参数:

  

- 编译器: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描述的两点也非常重要)

答案 1 :(得分:1)

在不知道项目的更多细节的情况下,请检查一下:

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

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