КАК sqlite3_load_extension из Objective-c [ошибка: изображение dlopen (...) не найдено] - PullRequest
0 голосов
/ 21 февраля 2010

Я пытаюсь загрузить расширение для sqlite3 для использования в коде target-c приложения iPhone. Я успешно скомпилировал c-файл новых функций в dylib с именем libsqlitefunctions.dylib. Здесь я немного растерялся. Я вызываю sqlite3_load_extension следующим образом:

char * error = sqlite3_malloc (MAX_SQLITE_ERROR_MESSAGE_SIZE); const char * library = [@ "libsqlitefunctions.dylib" UTF8String];

if (sqlite3_load_extension (база данных, библиотека, 0 и ошибка)! = SQLITE_OK) { сообщение = [NSString stringWithFormat: @ "% s", ошибка]; }

sqlite3_free (ошибка);

Что бы я ни делал, я получаю сообщение об ошибке: dlopen (libsqlitefunctions.dylib, 10): изображение не найдено

Я пытался:

  1. указывает полный путь к dylib
  2. указывает относительный путь
  3. без указания пути (как показано выше)
  4. добавление dylib в качестве основы
  5. добавление файла .c в мой проект и компиляция его в файл .o, а затем попытка загрузить его

Обратите внимание, что это не проблема точки входа, поскольку я передаю 0 в качестве аргумента Это заставит dylib загружаться, вызывая функцию init, определенную в dylib. Я даже не дохожу до этого.

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

Я был бы очень признателен за любые идеи, так как возможность использовать функции из этой библиотеки важна для функциональности моего приложения. Спасибо всем заранее.

Ответы [ 5 ]

1 голос
/ 21 февраля 2010

ОК, я воспользовался вашим советом и просто добавил свою новую функциональность в файл sqlite3.c, который был в моем проекте. Он скомпилирован и связан статически и работает нормально. Спасибо за идею. Я все еще хотел бы знать, что мешало мне загрузить расширение, но я рад узнать другие вещи в решении проблемы - ПЛЮС я уложился в срок. Еще раз спасибо.

0 голосов
/ 25 сентября 2016

После нескольких дней поиска я наконец нашел решение!

1) как только ваши файлы sqlite_extension.h и sqlite_extension.c были перемещены в папку sqlite_extension

2) перейдите в эту папку sqlite_extension

3) скомпилируйте ваш код, используя:

gcc -g -fPIC -std=gnu99 -current_version 1.0 -compatibility_version 1.0 -dynamiclib -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk sqlite_extension.c -o sqlite_extension.dylib

Возможно, вам придется изменить путь SDK для чего-то вроде ../iPhoneOSN.M.sdk, где NM указывает последнюю доступную версию iOS, посмотрите в папку "/Applications/Xcode.app/Contents/Developer/ Платформы / iPhoneOS.platform / Developer / SDKs / "для поиска существующего пути

4) Вы можете проверить полученный файл, используя:

file /path/to/your/sqlite_extension.dylib

который должен вернуть что-то вроде:

/./././sqlite_extension.dylib (for architecture armv7): Mach-O dynamically linked shared library arm
/./././sqlite_extension.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library

или используя более подробную информацию:

otool -l sqlite_extension.dylib

5) Теперь ваша библиотека должна быть подписана кодом с той же идентификацией, что и ваше приложение для встраивания, вы можете сделать это, используя:

codesign -fs "your_apple_identity" sqlite_extension.dylib

your_apple_identity может быть в форме "your_name: your_apple_login_email@address.xxx"

Лучший способ убедиться в этом - скопировать файл из исполняемого файла встроенного приложения, скомпилированного и запущенного на вашем устройстве, с помощью Xcode или архива на вашем компьютере, используя:

codesign --display --verbose=4 ~/Library/Developer/Xcode/Archives/2016-09-25/YourApp\ 25-09-2016\ 12.00.xcarchive/Products/Applications/YourApp.app/YourApp

Строка, которую следует использовать вместо "your_apple_identity", - это строка, найденная после первого вхождения Authority =

6) После того, как ваша библиотека подписана под кодом, вы можете проверить, что вы получаете информацию о подписи, аналогичную вашему приложению, используя ту же команду:

codesign --display --verbose=4 sqlite_extension.dylib

7) Ваша библиотека теперь готова для встраивания в ваше приложение, все что вам нужно, это убедиться, что Xcode обновляет файл библиотеки, если вы пробовали предыдущий файл с тем же именем. Для этого вы можете удалить прежний файл, скомпилировать и запустить его на своем устройстве, вернуть новый файл, убедившись, что он находится в «Ресурсах комплекта копирования», а не в «Связывать двоичные файлы с библиотеками» на вкладке «Фазы сборки» приложения

Ваше расширение должно загружаться без ошибок, когда ваше приложение запрашивает SQLite для его использования


iOS 9.3.5 Xcode 8.0 SQLite 3.9.2

0 голосов
/ 05 августа 2015

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

Получив исходный файл X.c, скомпилируйте общую библиотеку (на компьютере с Linux), используя

gcc -g -fPIC -shared X.c -o X.so

Где X.c - используемое расширение

Затем включите загрузку расширения в интерфейсе C для SQLite, используя

sqlite3_enable_load_extension(db,1);

Затем загрузите расширение, используя

sqlite3_load_extension(db,"/path/of/extension/X.so","sqlite3_X_init",0);

Вот и все, расширение будет загружено.

0 голосов
/ 06 января 2014

Я знаю, что тема старая. но поиск в Google привел меня сюда. и для тех, кто имеет эту проблему и в конечном итоге здесь: сначала позвони sqlite3_enable_load_extension (db, 1);

0 голосов
/ 21 февраля 2010

Я не уверен на 100%, что это явно запрещено, но другой тип динамической загрузки - платформы - не поддерживается на iPhone Возможно, вам придется компилировать и связывать библиотеку статически, а не динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...