无法在 monotouch 中使用本机库

Posted

技术标签:

【中文标题】无法在 monotouch 中使用本机库【英文标题】:Cannot use a native library in monotouch 【发布时间】:2012-01-29 20:15:41 【问题描述】:

我正在尝试为“iCarousel”objective-c 库创建一个 c# 绑定。 我为 Xcode 项目创建了一个新目标“Cocoa Touch 静态库”,之后我使用教程命令创建了静态库:

/Developer/usr/bin/xcodebuild -project iCarousel.xcodeproj -target libiCarousel -sdk iphonesimulator -configuration Release clean build
/Developer/usr/bin/xcodebuild -project iCarousel.xcodeproj -target libiCarousel -sdk iphoneos -arch armv6 -configuration Release clean build
/Developer/usr/bin/xcodebuild -project iCarousel.xcodeproj -target libiCarousel -sdk iphoneos -arch armv7 -configuration Release clean build
lipo -create -output libiCarousel.a libiCarousel-i386.a libiCarousel-armv6.a libiCarousel-armv7.a

现在一切都像魅力一样。 之后,我创建了一个新的 monotouch 绑定项目,包括“胖”静态库,使用新的 LinkWith 属性生成了一个 dll,它在模拟器和我的装有 ios 5.0 的 iPad 上运行良好。

这个问题只出现在我安装了 iOS 4.1 的旧 iPhone 3g 上。我制作的示例没有运行,调试器返回这个奇怪的错误:

dyld:惰性符号绑定失败:未找到符号:_objc_retainAutoreleasedReturnValue 引用自:/var/mobile/Applications/8160D667-16EF-45F7-9658-A096AD421A21/Sample.app/Sample 预期在:/usr/lib/libobjc.A.dylib

dyld:未找到符号:_objc_retainAutoreleasedReturnValue 引用自:/var/mobile/Applications/8160D667-16EF-45F7-9658-A096AD421A21/Sample.app/Sample 预期在:/usr/lib/libobjc.A.dylib

我几乎可以肯定这是我的 Xcode 项目属性以及 ARMv6 和 ARMv7 设置的错误,但我不知道如何处理。

更新:我使用过这样的 LinkWith: [程序集:LinkWith ("libiCarousel.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7, ForceLoad = true, Frameworks="CoreGraphics QuartzCore UIKit")]

更新:我注意到我的构建只能在 iOS 5 上运行。

答案:

好吧,我成功了!

所以,我的想法是我必须修改项目设置中的“achitectures”值以支持 armv6,并在所有头文件中添加“-fno-objc-arc”编译标志。 我为此写了一个教程,一步一步来,希望它可以帮助所有的monotouch粉丝。http://dantes-andreea.blogspot.com/2012/01/how-to-use-objective-c-library-in.html

【问题讨论】:

【参考方案1】:

好的,伙计们,我成功了! 所以,我的想法是我必须修改项目设置中的“achitectures”值以支持 armv6,并在所有头文件中添加“-fno-objc-arc”编译标志。 我为此写了一个教程,一步一步来,希望它可以帮助所有的monotouch粉丝。http://dantes-andreea.blogspot.com/2012/01/how-to-use-objective-c-library-in.html

【讨论】:

【参考方案2】:

假设我应该把它放在一个答案中,尽管它可能是错误的。好吧,这看起来是您的 iOS SDK 版本之间不兼容。一方面,您的库看起来像是为 iOS 5 构建的,这意味着它可能得到了完整的 ARC 处理等等。我不知道使用 ARC 时 iOS 4 和 5 的编译结果是否有所不同,所以对此持保留态度。

无论如何,如果您在构建时使用 ARC 支持,但将 iOS 5.0 作为最低 SDK,则通过应用一些在 iOS 5 上运行良好但在 iOS 5 上不支持的技巧,它可能与 iOS 4.1 不兼容iOS 4(同样,我对它的工作原理一无所知,所以你现在应该沐浴在盐中)。很难说,因为我从来没有遇到过这种情况,但这似乎是一个不错的猜测。您可能想尝试重建您的库并针对较早版本的 SDK。

【讨论】:

我在 Xcode 中将“3.2”设置为“iOS 部署目标”。项目属性中是否还有其他地方我必须更改它? 如果你的代码需要ARC,我相信你至少需要4.3。如果您绝对必须支持 3.2,那么您可能想要去除对 ARC 的任何依赖(尽管我个人怀疑支持 iOS 3 有多大意义)。 不,你是对的,3.2不需要,但是这些都是iCarousel项目的默认设置。当我在装有 iOS 4.1 的 iPhone 3g 上通过 Xcode 进行测试时,它可以正常工作。一定有某种方法可以让它在 Monodevelop 中也能正常工作。

以上是关于无法在 monotouch 中使用本机库的主要内容,如果未能解决你的问题,请参考以下文章

在 MonoTouch 应用程序中使用“气泡消息”聊天时,本机堆栈跟踪崩溃

对于某些构建目标,NDK构建器r15既未找到HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,也未找到pthread_condattr_setclock;构建失败

帮助在monotouch中绑定一个静态objective-c库

无法在 NodeJS 中使用本机 Windows 库

如何使用 monotouch 编译库(出现错误:尝试使用 --aot-only 进行 JIT 编译)

无法获得在grails 3中执行的本机库(.so)