Перейти к содержанию
Fire Monkey от А до Я
  • 0

Мануал по использованию сторонних нативных SDK. Нужна Ваша помощь


Дениска

Вопрос

Господа! Тема очень важная.

Как использовать сторонние нативные (написанные на Obj-C) фреймворки и SDK в Firemonkey (не дописана).

 

Имеется SDK, включающий статическую библиотеку, заголовок к ней и кучу классов упрощающих работу с библиотекой.

  1. libSDK.a
  2. SDK.h
  3. class1.h
  4. class1.m
  5. class2.h
  6. class3.m
  7. ...
  8. classN.h
  9. classN.m

Чтобы упростить себе жизнь, немного покопавшись:

  1. www.youtube.com/watch?v=f7lxkv-sZA0
  2. www.youtube.com/watch?v=5cnY8WNKRwg
  3. ...

я собрал из этой кучи файлов одну статическую библиотеку MyLib.a.

(Кому нужно знать как это делается, спрашивайте. Это отдельная тема.)

 

Как заверяют разработчики этого SDK, для использования этой библиотеки необходимо подключить пару нативных фреймворков и две динамические библиотеки:

  • SystemConfiguration.framework
  • CoreTelephony.framework
  • libstdc++.dylib
  • libz.dylib

Фреймворки стандартные и уже реализованы в RAD Studio, а библиотеки присутствуют в скачиваемом IOS SDK по пути:

C:\Users\Username\Documents\Embarcadero\Studio\SDKs\iPhoneOS9.0.sdk\usr\lib.

 

Embarcadero "побеспокоилась" о подключении сторонних статических библиотек. Создаётся функция (пример взят из сканера баркодов):

 

implementation

  procedure FakeLoader(произвольное имя); cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'; 

 

Реальная польза этой функции для меня остаётся загадкой, кроме того, что без неё приложение не увидит библиотеки и при попытки обратится к классу выдаст: "ObjectiveC class MyClass could not be found".

 

Для начала я создал на XCode libHelloWorld.a (думаю не нужно говорить, что она делает).

Немного покопавшись:

  1. ridingdelphi.blogspot.com/2014/01/the-quest-to-migrate-ios-squarecam-app_3169.html
  2. blog.blong.com/2013/05/delphi-for-ios-some-notes.html

написал хедер HelloWorld.pas, в котором описал классы и функции хранящиеся в этой библиотеке. Подключил pas в uses  в проекте и всё заработало.

(Кому нужно знать как это делается, спрашивайте. Это отдельная тема.).

Решил теперь подключить мою MyLib.a, которую я создал из основе SDK, можно сказать конвертировал. Но она требует две динамические библиотеки, что в случае с HelloWorld не требовалось.

 

Как подсказывает Embarcadero, мне нужно дописать в мой FakeLoader директиву dependency. Итого:

 

procedure FakeLoader; cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'
  dependency 'libstdc++.dylib', 'libz.dylib';

 

Но вот тут и нужна Ваша помощь!

 

Я помещал эти библиотеки прямо в проект, указывал абсолютные пути из MacPC и из моего PC, копировал оригинальные библиотеки из MacPC, писал их с расширением и без, с префиксом "lib" и без. IDE твердит одно:

 
   [DCC Error] E2597 ld: library not found for -llibz.dylib
   [DCC Error] E2597 ld: library not found for -llibstdc++.dylib

 

Без этих библиотек моя статическая библиотека MyLib.a не компилируется с ошибками:

 
    Error: "blablabla", referenced from: lalalala in MyLib.a(Class1.o);  lalalala in MyLib.a(Class1.o); 
    Error: "qwertyuui", referenced from: olololo in MyLib.a(Class2.o);  olololo in MyLib.a(Class2.o); 
    Error: "abracadabra", referenced from: abcdefjgh in MyLib.a(Class3.o);  abcdefjgh in MyLib.a(Class3.o); 
  ...
 
Кто сталкивался? Кто знает чем помочь? Пишите. Сейчас мой проект простаивает из-за этой проблемы.

 

Изменено пользователем Дениска
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

procedure FakeLoader; cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'

  dependency 'libstdc++.dylib', 'libz.dylib';

 

как я понял, так вы можете указать зависимости только от статичных библиотек

 

как и когда вы загружаете динамические библиотеки? приведите код

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

 

 

как я понял, так вы можете указать зависимости только от статичных библиотек

Лично я этого почему-то не понял. Embarcadero об этом не говорит

 

 

как и когда вы загружаете динамические библиотеки?
 Я их нигде не загружаю. У меня есть функция FakeLoader, но с помощью неё я линкую только статическую библиотеку. У меня вопрос следующего плана: есть ли возможность как-нибудь использовать dylib библиотеки на IOS, если того требует сторонняя SDK? Или, может быть, существует обходной путь.
Изменено пользователем Дениска
Ссылка на комментарий
  • 0
  • Модераторы
Лично я этого почему-то не понял. Embarcadero об этом не говорит

ну как мне кажется при линковке должен проверить правильность адресов в библиотеке, а проверить он может только в статической библиотеке (.a)

при использовании динамических библиотек, их нужно загрузить через LoadLibrary, а как линковать я незнаю

 

хотя может в корне ошибаюсь

Ссылка на комментарий
  • 0

1)   Delphi -> Project Options -> Building -> Delphi Compiler -> Linking -> Option passed to the LD linker
Добавил нужные для компиляции зависимости стороннего framework с соответствующими параметрами и бибилиотеками

у меня например:
   -ObjC -L C:\Users\Andrey\Documents\Embarcadero\Studio\SDKs\iPhoneOS12.1.sdk\usr\lib ..\_CommonModules\YandexMetrica\Frameworks\Foundation.framework\Foundation ......
..... -lsqlite3 -lz -lc++

(после такой линковки второй пункт не понадобился)

Но на всякий дополню
2)

Цитата

procedure FakeLoader; cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'
  dependency 'libstdc++.dylib', 'libz.dylib';

  dependency 'stdc++', 'z';

Изменено пользователем void
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...