IOS, загруженная динамическая библиотека не может найти локальные функции CIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 IOS, загруженная динамическая библиотека не может найти локальные функции C

Сообщение Anonymous »

У меня есть динамическая библиотека, которую я загружаю в iOS. Эта библиотека обернута в библиотеку конкретной iOS через кокопод и SPM. Специфика того, как я создал и загружен, его можно найти здесь. Все работает правильно, и я могу вызвать функции в моем Dylib.

Код: Выделить всё

OBJC_EXTERN void ios_prepare_request(const char *url);
< /code>
Определение: < /pbr /> 

#define EXPORT __attribute__((visibility("default"), used))

extern "C" {

EXPORT void ios_prepare_request(const char *url) {
NSString *urlString = [NSString stringWithUTF8String:url];
// global variable in my library
request =
[NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
}
< /code>
This Dylib использует функции C, которые я определил. На Android это работает правильно через cmakelists.txt 
:

Код: Выделить всё

set_target_properties(sdk PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libsdk.so
IMPORTED_NO_SONAME ON)
< /code>
Но на iOS это просто не удается во время выполнения. Нет конкретной ошибки, просто Exc_bad_access 
. На функциях, которые не зависят от моих собственных функций C, все работает правильно. Так что это ошибка экспозиции символа. < /P>
вещи, которые я пробовал, но не работаю: < /p>

Настройка .podspec < /code> Добавить флаги линкера, ни один из них не работал.

Код: Выделить всё

  s.pod_target_xcconfig = {
'OTHER_LDFLAGS' => '-Wl,-export_dynamic -rdynamic',
'GCC_SYMBOLS_PRIVATE_EXTERN' => 'NO'
}
s.user_target_xcconfig = {
'OTHER_LDFLAGS' => '-Wl,-export_dynamic -rdynamic'
}
Пробовал загрузить основной исполняемый файл с помощью dlopen , а также использовать dlsym , чтобы загрузить функции C перед вызовом dlopen на моем собственном Dylib-letriefec streatper-Quare-Quare-avert-avert-avert-avert-avert-avert-avert-avert-avert-averte

Код: Выделить всё

  // First, load the main executable to make its symbols available
void *main_handle = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);
if (!main_handle) {
NSString *errorMessage = [NSString stringWithUTF8String:dlerror()];
*error =
[NSError errorWithDomain:@"OpacitySDKMainError"
code:1003
userInfo:@{NSLocalizedDescriptionKey : errorMessage}];
return -1;
}

// Explicitly resolve and verify our iOS function symbols are available
void *prepare_request_fn = dlsym(RTLD_DEFAULT, "ios_prepare_request");

// THIS FAILS, dlsym returns null
if (!prepare_request_fn) {
NSString *errorMessage = @"Failed to resolve iOS helper function symbols";
*error =
[NSError errorWithDomain:@"OpacitySDKSymbolError"
code:1004
userInfo:@{NSLocalizedDescriptionKey : errorMessage}];
return -1;
}

NSBundle *dylib_bundle =
[NSBundle bundleWithIdentifier:@"com.opacitylabs.sdk"];
NSString *dylib_path = [dylib_bundle pathForResource:@"sdk" ofType:@""];

// Load the dynamic library
void *handle = dlopen([dylib_path UTF8String], RTLD_LAZY | RTLD_GLOBAL);
if (!handle) {
NSString *errorMessage = [NSString stringWithUTF8String:dlerror()];
*error =
[NSError errorWithDomain:@"OpacitySDKDylibError"
code:1002
userInfo:@{NSLocalizedDescriptionKey : errorMessage}];
return -1; // or appropriate error code
}

Есть ли я в любом случае, я могу подвергать свои функции Extern C на загруженный Dylib в iOS?

Подробнее здесь: https://stackoverflow.com/questions/797 ... -functions
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»