Компиляция проекта libGDX для iOS: сбой встроенной компоновки

В настоящее время я разрабатываю небольшую мультиплатформенную игру с libGDX. Игра отлично работает на Windows, Android и OSX, но я не могу скомпилировать ее для iOS.

В руководстве по libGDX для iOS есть несколько предостережений, но я уверен, Я принял все во внимание. У меня есть Eclipse, Xamarin.iOS, JDK, Ant и $PATH, $IKVM_HOME установлены как надо. Файл gamename.dll (который представляет собой скомпилированную dll из Mono, которая содержит всю мою игровую логику и автоматически генерируется из кода Java) создан, и все выглядит в порядке.

Однако при компиляции я получаю следующее сообщение об ошибке:

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)

(Пути немного сокращены для краткости.)

Эти аргументы автоматически генерируются libGDX при создании проекта iOS и выглядят так в настройках проекта 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 — это одна из упомянутых библиотек DLL, которая была автоматически добавлена ​​libGDX при создании проекта.

Я предполагаю, что это означает, что с моими настройками что-то не так, но я не могу найти ничего похожего на то, что это связано.

Есть идеи?

РЕДАКТИРОВАТЬ: после добавления структуры, предложенной 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"

person Erlend D.    schedule 20.06.2013    source источник


Ответы (2)


Так что -framework AVFoundation необходим, по крайней мере, если ваше приложение не ссылается на типы в MonoTouch.AVFoundation. В этом более позднем случае фреймворк будет автоматически связан.

OTOH, у этих трех символов есть еще одна общая черта: они все новые в iOS6.

И это противопоставляет нашу сборку iOS 5.1, т.е.

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk

Таким образом, символы отсутствуют (в упомянутом AVFoundation.framework), и ваш libObjectAL-universal.a не доволен отсутствующими символами.

Оттуда у вас есть два варианта:

  1. Установите минимальную версию сборки на iOS6 (которая уже занимает 93% рынка);

  2. Попробуйте найти (или собрать) libObjectAL без зависимостей от iOS 6 API.

person poupou    schedule 21.06.2013
comment
Ах, спасибо! Я хотел бы установить свою минимальную версию сборки, но я могу найти только 5.1. Я что-то не так установил? В Options => iOS Build => SDK version у меня всего два варианта: 5.1 и Default. В iOS Application => Deployment Target у меня много версий, но не выше 5.1. 3.2 в настоящее время выбран. В раскрывающемся списке сборки я могу выбрать iPad Simulator 5.1 или iPhone Simulator 5.1, но не для 6.1. У меня XCode версии 4.3.2 и Xamarin версии 4.0.8b2. Я пропустил что-то очевидное? - person Erlend D.; 21.06.2013
comment
Это связано с тем, что ваша версия Xcode, включающая iOS SDK, слишком старая (она была выпущена до того, как стала доступна версия 6.0). Вам нужно будет обновить его до версии 4.5 (или 4.6), чтобы получить поддержку iOS 6 (или 6.1) SDK. - person poupou; 21.06.2013
comment
Да, это решило проблему. Большое спасибо! (Извините, что мне потребовалось так много времени, чтобы проверить ваш ответ - это был корпоративный Mac, поэтому, естественно, мне потребовались все четыре дня, чтобы получить необходимые разрешения для обновления Xcode.) - person Erlend D.; 27.06.2013

Одна из ваших собственных библиотек (libObjectAL из ваших журналов) требует, чтобы платформа AVFoundation была связана с вашим приложением.

Примечание: вы можете отчасти догадаться об этом по префиксу _AV* у ненайденных типов.

Решение: добавьте -framework AVFoundation к -gcc_flags и перестройте приложение.

person poupou    schedule 20.06.2013
comment
Спасибо, это, вероятно, шаг в правильном направлении, но теперь я получаю i686-apple-darwin11-llvm-g++-4.2: AVFoundation: вместо этого нет такого файла или каталога. Я предполагаю, что это означает, что мне нужно где-то включить AVFoundation в решение Xamarin, но я не могу понять, где он находится и как его добавить. - person Erlend D.; 21.06.2013
comment
Он должен быть внутри вашего -gcc_flags, так как это директива, которую вы даете собственному компоновщику (Apple). OTOH Я сделал опечатку (исправил), это должно было быть -framework AVFoundation, а не --framework AVFoundation (только одно -). - person poupou; 21.06.2013
comment
Спасибо, но, похоже, это не имеет значения, см. мое редактирование в исходном сообщении. Сообщение об ошибке кажется идентичным, но я вижу, что -framework AVFoundation теперь добавляется в конец первой строки. Обратите внимание, однако, что похоже, что этот фреймворк уже включен (если вы прокрутите по горизонтали немного до центра, -framework AVFoundation уже там, вместе с множеством других фреймворков). - person Erlend D.; 21.06.2013
comment
Можете ли вы вставить (и добавить ссылку) свой полный журнал сборки? - person poupou; 21.06.2013
comment
Да, вот он: pastebin.com/xVwQ3cWX Первая часть — это скрипт libGDX, который создает Mono-dll. . (Вплоть до последнего метода письма, я полагаю.) - person Erlend D.; 21.06.2013