Xamarin 无法编译为本机代码

Posted

技术标签:

【中文标题】Xamarin 无法编译为本机代码【英文标题】:Xamarin failing to compile to native code 【发布时间】:2012-10-07 18:28:24 【问题描述】:

我正在尝试在 Xamarin 中使用 Good Dynamics SDK,我不太了解 Objective-C,所以在这里我有点迷路。这是一个概念验证的尝试,我不确定这是否真的可行。

我已将 GD 文件添加为 GD.framework 目录中的 GD.a,并尝试实现 API 绑定并复制示例 XCode 项目中的应用程序启动逻辑。

即使 Mono Develop 以红色显示 ApiDefinition 中的所有内容,我还是设法构建了它。

构建时这是错误日志的一部分Full version here

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc  -Wl,-no_pie -arch i386 -gdwarf-2 -fobjc-legacy-dispatch -fobjc-abi-version=2 -miphoneos-version-min=6.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk  /var/folders/1t/cbdvyj0x4n35m7674l7wvyjc0000gn/T/tmp6df5493a.tmp/main.x86.o -o /var/folders/1t/cbdvyj0x4n35m7674l7wvyjc0000gn/T/tmp6df5493a.tmp/GDTest -framework CFNetwork -framework Foundation -framework GameKit -framework MapKit -framework MediaPlayer -framework MessageUI -framework OpenGLES -framework StoreKit -framework UIKit -framework AddressBookUI -framework SystemConfiguration -framework AddressBook -framework AudioToolbox -framework AVFoundation -framework QuartzCore -framework CoreGraphics -framework CoreLocation -framework MobileCoreServices -framework Security -framework CoreData -framework ExternalAccessory -weak_framework AssetsLibrary -weak_framework Accounts -weak_framework CoreBluetooth -weak_framework CoreTelephony -weak_framework EventKit -weak_framework EventKitUI -weak_framework CoreMotion -weak_framework GLKit -weak_framework iAd -weak_framework NewsstandKit -weak_framework Social -weak_framework Twitter -weak_framework PassKit -weak_framework CoreImage -weak_framework CoreText -weak_framework ImageIO -weak_framework CoreMedia -weak_framework CoreMIDI -weak_framework CoreVideo -weak_framework AdSupport -weak_framework QuickLook -lz -u _mono_pmip -u _CreateZStream -u _CloseZStream -u _Flush -u _ReadZStream -u _WriteZStream -liconv -lmono-2.0 -lmonotouch -L/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk/usr/lib -u _catch_exception_raise  -force_load /var/folders/1t/cbdvyj0x4n35m7674l7wvyjc0000gn/T/tmp6df5493a.tmp/GD.a
    Undefined symbols for architecture i386:
      "std::basic_istream<char, std::char_traits<char> >::gcount() const", referenced from:
          GT::AES::decode(std::basic_istream<char, std::char_traits<char> >&, std::basic_ostream<char, std::char_traits<char> >&, unsigned int&, bool)in GD.a(gtaes.o)
          GT::AES::encode(std::basic_istream<char, std::char_traits<char> >&, std::basic_ostream<char, std::char_traits<char> >&, unsigned int&, bool)in GD.a(gtaes.o)
      "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_first_of(char const*, unsigned long, unsigned long) const", referenced from:
          -[GDSetPasswordViewController checkPasswordStrength:] in GD.a(GDSetPasswordViewController.o)
          GD::EacpCReq::EacpCReq(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, GT::Dbb&)in GD.a(GDEacpCommands.o)
          GD::RawSocket::connect()    in GD.a(GDRawSocket.o)
      "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::copy(char*, unsigned long, unsigned long) const", referenced from:
          GD::Socket::toString() constin GD.a(GDSocket.o)
      "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::data() const", referenced from:
          -[GTContainerDH setRemotePublic521:] in GD.a(GTContainerCrypto.o)
          -[GTContainerDH initWithP521] in GD.a(GTContainerCrypto.o)
          -[NSData(GTContainerEncryption) GTEncryptedDataUsingDerivedKey:] in GD.a(GTContainerCrypto.o)
          -[NSData(GTContainerEncryption) GTDecryptedDataUsingDerivedKey:] in GD.a(GTContainerCrypto.o)
          -[GTEncryptedFile streamDidReceiveData:] in GD.a(GTEncryptedFile.o)
          +[NSData(Base64) dataFromBase64String:] in GD.a(NSData+Base64.o)
          +[GTJsonCommandProcessor parseNSData:] in GD.a(GTICCJsonCommandProcessor.o)
          ...

这会持续很长时间,并以错误结束

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

error MT5202: Native linking failed. Please review the build log.

现在我有点卡住了。有什么想法吗?

谢谢

【问题讨论】:

您能提供您的绑定以便我们看一下吗?我下载了 GS>framework,它是 armv7 armv7s i386,所以错误很奇怪 我已经把代码放在这里了; github.com/garethrhughes/GDTest谢谢 【参考方案1】:

这是一个老问题,但经过数小时后,我们在此处详细编写了将 Good Dynamics 与 Xamarin.ios 结合使用的完整解决方案……需要大约 5 种不同的解决方法。

http://blog.westmonroepartners.com/using-good-dynamics-sdk-v1-8-x-with-xamarin-ios/

【讨论】:

【参考方案2】:

我需要将 -cxx 添加到 iPhone 构建选项中的“附加 mtouch 参数”中。

【讨论】:

也许这就是解决方案,但为什么呢?【参考方案3】:

ld 消息告诉您,您的.a 静态库文件不包含 i386 的代码。该架构是允许您在 iOS 模拟器上运行代码所必需的。

也许 GD 包为不同的架构提供了不同的.a。在这种情况下,您可以使用lipo 工具构建一个包含多个架构的fat 库。

【讨论】:

mmm GD.Framework is armv7 armv7s i386 也许@Gareth 缺少一些东西 解决了那个特殊的问题,谢谢! iPhone 有一个 GD,iPhoneSimulator 有一个单独的。 好像没有解决。它以某种方式停止了实际链接。我已经从 iPhoneOS 平台文件夹和 iPhoneSimulatorOS 平台文件夹中添加了 GD 文件并得到相同的结果。

以上是关于Xamarin 无法编译为本机代码的主要内容,如果未能解决你的问题,请参考以下文章

xamarin forms ios release build 挂起

Xamarin 项目中的混淆

xamarin UI 测试 - 无法加载我指向的本机 APK 路径

Xamarin.Android - 本机代码编译是不是使逆向工程更难?

Xamarin.Forms + 本机库 OpenCV

在 Xamarin.IOS 中执行本机代码时获得 SIGSEGV