Собственная ошибка компоновки при связывании xamarin ios
Я пишу оболочку, которая привязывается к iOS SDK с использованием P/Invoke, поскольку Sharpie не смог сгенерировать компилируемый код для этого SDK.
При компиляции iOS-приложения с указанным проектом-оберткой у меня возникает много проблем со связыванием, таких как эта:
MTOUCH: ошибка MT5210: не удалось создать собственное соединение, неопределенный символ: std::locale::classic(). Пожалуйста, убедитесь, что на все необходимые фреймворки были сделаны ссылки, и нативные библиотеки правильно связаны. MTOUCH: ошибка MT5210: Неверное связывание с родным, неопределенный символ: std::__throw_bad_cast(). Пожалуйста, убедитесь, что на все необходимые фреймворки были сделаны ссылки, и нативные библиотеки правильно связаны. MTOUCH: ошибка MT5210: Неверное связывание с родным, неопределенный символ: std::invalid_argument::invalid_argument(std::string const&). Убедитесь, что на все необходимые фреймворки были сделаны ссылки, и нативные библиотеки правильно связаны. (Пожалуйста, найдите полный журнал в этом полном файле журнала.)
Дополнительный аргумент mono touch, переданный из проекта 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 -ObjD -L {Project } -безопасность фреймворка -рамка CoreVideo -фреймворк CoreMedia -фреймворк AVFoundation -framework CFNetwork -фреймворк ускорение "
SDK состоит из трех библиотек: libcrypto.a, libssl.a и libsipwrapper.a.
После многих статей / постов в Интернете рекомендуется добавить добавить стандартную библиотеку, такую как -lstdC++, lz и ObjC, но, похоже, это не работает в моем случае.
Я также попытался создать Binding Project, который включает в себя три библиотеки и код оболочки, содержимое, добавляемое в ссылку с файлами, выглядит так:
[сборка: LinkWith ("libsipwrapper.a", LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Arm64, Frameworks = "CoreVideo CoreMedia AVFoundation LinkerFlags = "-lstdC++ -lresolv -liconv -lxml2 -lz -ObjC")]
Проблема не была решена, и я продолжаю иметь описанные ошибки компоновки.
2 ответа
После двух дней потерянного времени, я, наконец, понял, что, очевидно, нет смысла угадывать параметры, передаваемые на связь, чтобы правильно связать библиотеку, созданную на уровне только вами. Чтобы упростить задачу, я скомпилировал демонстрационное приложение, предоставленное провайдером SDK, и использовал Xcode для компиляции демонстрации и получает параметры, отправленные 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 -ideoFramework AVFoundation -framework CFNetwork -framework AudioToolbox -framework CoreAudio -lz -lxml2 -framework CoreGraphics -framework UIKit -framework Foundation -L${ProjectDir} -force_load ${ProjectDir}/Libs/libsipwrapper.a"
Надеюсь, что это поможет другим парням.
(Проверьте, что две точки, описанные @NyxSway ниже, также очень важны)
Не зная больше деталей вашего проекта, вы проверили:
1) Вы проверили, действительно ли в вашем.a файле есть этот символ, который он жалуется на использование команды Terminal -> grep, для всей поддерживаемой архитектуры: armv7 / armv7s / arm64
2) в своем коде C# вы использовали [DllImport ("__Internal")] вместо имени своей библиотеки?