为iOS编译libGDX项目:本机链接失败
我目前正在用libGDX开发一个小型多平台游戏。这个游戏在Windows、Android和OSX上运行得很好,但我不能让它为iOS编译 美国政府提出了一些警告,但我很肯定我已经考虑到了一切。我有Eclipse、Xamarin.iOS、JDK、Ant和$PATH,$IKVM_HOME已经设置好了。gamename.dll(包含我所有游戏逻辑的Mono编译dll,由Java代码自动生成)已经创建,看起来一切正常 但是,在编译时,我收到以下错误消息:为iOS编译libGDX项目:本机链接失败,ios,xamarin.ios,avfoundation,libgdx,objectal,Ios,Xamarin.ios,Avfoundation,Libgdx,Objectal,我目前正在用libGDX开发一个小型多平台游戏。这个游戏在Windows、Android和OSX上运行得很好,但我不能让它为iOS编译 美国政府提出了一些警告,但我很肯定我已经考虑到了一切。我有Eclipse、Xamarin.iOS、JDK、Ant和$PATH,$IKVM_HOME已经设置好了。gamename.dll(包含我所有游戏逻辑的Mono编译dll,由Java代码自动生成)已经创建,看起来一切正常 但是,在编译时,我收到以下错误消息: Error MT5201: Native link
Error MT5201: Native linking failed. Please review user flags provided to gcc: "-L/Users/blah/Ultralyd/Ultralyd-ios/libs/ios" "-L/Users/blah/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin" "-likvm-natives" "-lgdx" "-force_load" "/Users/blah/Ultralyd/Ultralyd-ios/libs/ios/libgdx.a" "-force_load" "/Users/blah/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin/libikvm-natives.a" (MT5201)
(为了简洁起见,路径略为缩写。)
这些参数在创建iOS项目时由libGDX自动生成,在Xamarin的项目设置中如下所示:
-nosymbolstrip -nostrip -cxx -gcc_flags "-L${ProjectDir}/libs/ios -L${ProjectDir}/libs/ios/ikvm/bin -likvm-natives -lgdx -force_load ${ProjectDir}/libs/ios/libgdx.a -force_load ${ProjectDir}/libs/ios/ikvm/bin/libikvm-natives.a"
生成输出包含以下内容:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++ -Wl,-no_pie -arch i386 -gdwarf-2 -fobjc-legacy-dispatch -fobjc-abi-version=2 -miphoneos-version-min=3.2 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk /Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/obj/iPhoneSimulator/Debug/mtouch-cache/main.i386.cache.vqL1439yU4Eq3JVRLyBeXkLz910=.o -o /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp1da69439.tmp/iosgame -framework CFNetwork -framework Foundation -framework OpenGLES -framework UIKit -framework AVFoundation -framework QuartzCore -framework CoreGraphics -framework OpenAL -framework AudioToolbox -lz -liconv -u _mono_pmip -u _monotouch_create_managed_ref -u _monotouch_release_managed_ref -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_IntPtr_objc_msgSendSuper_IntPtr -u _CloseZStream -u _CreateZStream -u _Flush -u _ReadZStream -u _WriteZStream -lmono-2.0 -lmonotouch-debug -L/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk/usr/lib -u _catch_exception_raise -force_load /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp1da69439.tmp/libObjectAL-universal.a "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin" "-likvm-natives" "-lgdx" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/libgdx.a" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin/libikvm-natives.a"
Process exited with code 1, command:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++ -Wl,-no_pie -arch i386 -gdwarf-2 -fobjc-legacy-dispatch -fobjc-abi-version=2 -miphoneos-version-min=3.2 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk /Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/obj/iPhoneSimulator/Debug/mtouch-cache/main.i386.cache.vqL1439yU4Eq3JVRLyBeXkLz910=.o -o /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp1da69439.tmp/iosgame -framework CFNetwork -framework Foundation -framework OpenGLES -framework UIKit -framework AVFoundation -framework QuartzCore -framework CoreGraphics -framework OpenAL -framework AudioToolbox -lz -liconv -u _mono_pmip -u _monotouch_create_managed_ref -u _monotouch_release_managed_ref -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_IntPtr_objc_msgSendSuper_IntPtr -u _CloseZStream -u _CreateZStream -u _Flush -u _ReadZStream -u _WriteZStream -lmono-2.0 -lmonotouch-debug -L/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk/usr/lib -u _catch_exception_raise -force_load /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp1da69439.tmp/libObjectAL-universal.a "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin" "-likvm-natives" "-lgdx" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/libgdx.a" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin/libikvm-natives.a"
Undefined symbols for architecture i386:
"_AVAudioSessionInterruptionNotification", referenced from:
-[OALAudioSession init] in libObjectAL-universal.a(OALAudioSession.o)
"_AVAudioSessionInterruptionTypeKey", referenced from:
-[OALAudioSession handleInterruption:] in libObjectAL-universal.a(OALAudioSession.o)
"_AVAudioSessionInterruptionOptionKey", referenced from:
-[OALAudioSession handleInterruption:] in libObjectAL-universal.a(OALAudioSession.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
libObjectAL是libGDX在创建项目时自动添加的引用DLL之一
我想这意味着我的设置有问题,但我找不到任何与之相关的东西
有什么想法吗
编辑:在添加poupou建议的框架后,我现在收到一条稍微不同的错误消息:
EDIT1b:不,实际上是一样的。唯一的区别是参数
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++ -Wl,-no_pie -arch i386 -gdwarf-2 -fobjc-legacy-dispatch -fobjc-abi-version=2 -miphoneos-version-min=3.2 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk /Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/obj/iPhoneSimulator/Debug/mtouch-cache/main.i386.cache.1rmDllI2qRyDYwNzBd+9+oPccNg=.o -o /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp141160e6.tmp/iosgame -framework CFNetwork -framework Foundation -framework OpenGLES -framework UIKit -framework AVFoundation -framework QuartzCore -framework CoreGraphics -framework OpenAL -framework AudioToolbox -lz -liconv -u _mono_pmip -u _monotouch_create_managed_ref -u _monotouch_release_managed_ref -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_IntPtr_objc_msgSendSuper_IntPtr -u _CloseZStream -u _CreateZStream -u _Flush -u _ReadZStream -u _WriteZStream -lmono-2.0 -lmonotouch-debug -L/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk/usr/lib -u _catch_exception_raise -force_load /var/folders/4p/g1k6g_v51kn35jm5yyh3g74m0000gq/T/tmp141160e6.tmp/libObjectAL-universal.a "-framework" "AVFoundation" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin" "-likvm-natives" "-lgdx" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/libgdx.a" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin/libikvm-natives.a"
Undefined symbols for architecture i386:
"_AVAudioSessionInterruptionNotification", referenced from:
-[OALAudioSession init] in libObjectAL-universal.a(OALAudioSession.o)
"_AVAudioSessionInterruptionTypeKey", referenced from:
-[OALAudioSession handleInterruption:] in libObjectAL-universal.a(OALAudioSession.o)
"_AVAudioSessionInterruptionOptionKey", referenced from:
-[OALAudioSession handleInterruption:] in libObjectAL-universal.a(OALAudioSession.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
error MT5201: Native linking failed. Please review user flags provided to gcc: "-framework" "AVFoundation" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios" "-L/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin" "-likvm-natives" "-lgdx" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/libgdx.a" "-force_load" "/Users/erlenddahl/Copy/UltralydDebugging/Libgdx/Ultralyd/Ultralyd-ios/libs/ios/ikvm/bin/libikvm-natives.a"
您的一个本机库(日志中的
libObjectAL
)需要将AVFoundation框架链接到您的应用程序
注意:您可以从未找到的类型的\u AV*
前缀中猜到这一点
解决方案:将
-framework AVFoundation
添加到您的-gcc_标志
中,并重建您的应用程序。因此需要-framework AVFoundation
,至少在您的应用程序未引用MonoTouch.AVFoundation
中的类型的情况下。在以后的情况下,框架将自动链接
这三个符号还有一个共同点:它们在iOS6中都是新的
它将我们的you building与iOS 5.1进行对比,即
-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk
因此符号不存在(在引用的AVFoundation.framework
中),并且您的libObjectAL universal.a
对缺少的符号不满意
在这里,您有两个选择:
libObjectAL
谢谢,这可能是朝着正确的方向迈出的一步,但我现在看到的是“i686-apple-darwin11-llvm-g++-4.2:AVFoundation:没有这样的文件或目录”。我假设这意味着我需要在Xamarin解决方案中的某个地方包含AVFoundation,但我不知道它在哪里,也不知道如何添加它。它必须位于您的
-gcc_标志
中,因为它是您给本机(Apple)链接器的指令。我打错了一个字(固定的),应该是-framework-AVFoundation
,而不是-framework-AVFoundation
(只有一个-
)。谢谢,但似乎没什么区别,请看我在原始帖子中的编辑。错误消息似乎相同,但我可以看到“-framework”“AVFoundation”现在添加到第一行的末尾。但是,请注意,该框架似乎已经包含在内(如果您水平滚动到中心前一点,“-framework AVFoundation”已经存在,以及许多其他框架)。您可以粘贴完整的构建日志(并添加链接)吗?是的,这里是:第一部分是构建monodll的libGDX脚本。(我相信直到最后一种“书写方法”)啊,谢谢!我很想设置我的最低版本,但我只能找到5.1。是否有我没有正确安装的东西?在Options=>iOS Build=>SDK版本中,我只有两个选项:“5.1”和“Default”。在iOS Application=>Deployment Target中,我有很多版本,但没有一个版本高于5.1。3.2当前已选定。在build下拉列表中,我可以选择“ipadsimulator5.1”或“iphonesimulator5.1”,6.1中没有。我有XCode版本4.3.2和Xamarin版本4.0.8b2。我遗漏了什么明显的东西吗?那是因为您的Xcode版本(包括iOS SDK)太旧了(它是在6.0可用之前发布的)。您需要将其更新为4.5(或4.6)才能获得iOS 6(或6.1)SDK支持。是的,这解决了问题。非常感谢你!(很抱歉,我花了这么长时间才检查您的答案——这是一个公司的Mac,所以很自然,我花了整整四天的时间才获得更新Xcode所需的权限。)