Apple TV — создание и загрузка динамической библиотеки (dylib)

Я хотел бы загрузить общий объект c/c++ в свой проект Apple TV. Я создаю простую библиотеку, используя следующий учебник:

Ссылка

Из-за того, что я хочу скомпилировать и загрузить его в свой проект Apple TV, я внес некоторые изменения:

  1. Код dlopen находится в моем ViewController.m, на котором пользователь нажимает кнопку, а затем вызывается dlopen.

    // Open the library.
    NSString * libraryname = [NSString stringWithFormat:@"libRatings.A"];
    NSString * libraryfullpath = [mainBundle pathForResource:libraryname ofType:@"dylib"];
    
    void *lib_handle = dlopen([libraryfullpath UTF8String], RTLD_NOW);
    if (lib_handle)
    {
     printf("[%s] dlopen(\"%s\", RTLD_NOW): Successful\n", __FILE__,      "library");
    }
    else
    {
        printf("\n\n[%s] Unable to open library: %s\n",
           __FILE__, dlerror());
        exit(EXIT_FAILURE);
    }
    
  2. изменил команду компиляции на:

    clang -dynamiclib -std=gnu99 -current_version 1.0 -compatibility_version 1.0 -fvisibility=hidden -arch arm64 -mtvos-version-min=9.2 -g -Wno-sign-conversion -fembed-bitcode-marker -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk Ratings.c -o libRatings.A.dylib
    
  3. Я скопировал свою dylib в свой проект и убедился, что она копируется как ресурс пакета.

При запуске моего приложения после сбоя вызова dlopen я получаю следующую ошибку:

[/Users/gfsrnd/Documents/sample1/sample1/sample1/ViewController.m] Unable to open library: dlopen(/var/containers/Bundle/Application/CFF7EC2A-7DF5-4270-9E99-2D5FAEBB0275/sample1 copy.app/libRatings.A.dylib, 2): no suitable image found.  Did find:
/var/containers/Bundle/Application/CFF7EC2A-7DF5-4270-9E99-2D5FAEBB0275/sample1 copy.app/libRatings.A.dylib: mmap() error 1 at address=0x1024D4000, size=0x00008000 segment=__TEXT in Segment::map() mapping /var/containers/Bundle/Application/CFF7EC2A-7DF5-4270-9E99-2D5FAEBB0275/sample1 copy.app/libRatings.A.dylib

Результат otool:

**> otool -TV libRatings.A.dylib**
libRatings.A.dylib:
Table of contents (0 entries)
module name      symbol name

Результат нм:

    **>nm -ag libRatings.A.dylib**

             U ___stack_chk_fail
             U ___stack_chk_guard
             U ___strncat_chk
    0000000000007d30 T _addRating
    0000000000007ecc T _clearRatings
    0000000000007db8 T _meanRating
                     U _memset
                     U _printf
    0000000000007ebc T _ratings
                     U _strdup
                     U _strlen
                     U dyld_stub_binder

Может ли кто-нибудь посоветовать, что я делаю неправильно?

Спасибо


person Yahav Zamari    schedule 10.05.2016    source источник
comment
Вы не можете динамически загружать код на iOS или tvOS.   -  person bbum    schedule 10.05.2016
comment
Спасибо. Вместо этого я решил использовать статическую ссылку...   -  person Yahav Zamari    schedule 12.05.2016
comment
Может быть, вы можете сделать это с помощью этого трюка: ddeville.me/2014/04/dynamic-linking   -  person macabeus    schedule 01.04.2017


Ответы (1)


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

Я просто использовал статическую ссылку..

person Yahav Zamari    schedule 23.05.2016