Собственная ошибка компоновки при связывании 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")] вместо имени своей библиотеки?

Другие вопросы по тегам