1

我正在编写一个使用 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 项目传递的额外单声道触摸参数描述如下:

-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,但这似乎不适用于我的情况。

我还尝试创建一个包含三个库和包装器代码的绑定项目,添加到链接文件的内容看起来像这样:

[程序集: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")]

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

4

2 回答 2

2

浪费了两天的时间,终于搞定了,说清楚,要传给touch的参数不明显,要正确链接一个自己一个层建的库。为了简化任务,我编译了 SDK 提供者提供的 demo 应用程序,并使用 Xcode 编译了 demo 并获取了 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 描述的两点也很重要)

于 2016-06-08T16:18:51.647 回答
1

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

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

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

于 2016-06-07T23:57:42.413 回答