【问题标题】:Native linking error on xamarin ios bindingxamarin ios绑定上的本机链接错误
【发布时间】:2016-10-07 11:18:50
【问题描述】:

我正在编写一个使用 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&)。请确认所有必要的框架都已被引用,并且本地库已正确链接。(请在此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,但这似乎不适用于我的情况。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    浪费了两天的时间,我终于明白了,要明确的是,猜测传递给触摸的参数并不明显,要正确链接一个由你自己构建的层的库。为了简化任务,我编译了 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 描述的两点也很重要)

    【讨论】:

    • 我也有同样的情况。你能告诉我你在哪里找到看到XCode发送给clang++的编译参数的地方吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 首先,感谢您的回答, 1. 尚未检查 .a 文件是否具有不同支持架构的符号,我现在将检查它们并反馈您。 2. 是的,我使用的是 [DllImport("__Internal")] 而不是 [DllImport("libsipwrapper")]。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2020-07-19
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多