我正在编写一个使用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”)]
问题没有解决,我继续有所描述的链接错误。
答案 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")]而不是您自己的库名?