Objective c 苹果电视-创建和加载动态库(动态库)

Objective c 苹果电视-创建和加载动态库(动态库),objective-c,xcode,macos,dlopen,apple-tv,Objective C,Xcode,Macos,Dlopen,Apple Tv,我想在我的Apple TV项目中加载一个c/c++共享对象。 我使用以下教程创建了一个简单的库: 由于我想编译并加载到我的Apple TV项目中,我做了一些更改: dlopen代码在my ViewController.m中,用户按下按钮,然后调用dlopen // Open the library. NSString * libraryname = [NSString stringWithFormat:@"libRatings.A"]; NSString * libraryfullpath =

我想在我的Apple TV项目中加载一个c/c++共享对象。 我使用以下教程创建了一个简单的库:

由于我想编译并加载到我的Apple TV项目中,我做了一些更改:

  • dlopen代码在my 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);
    }
    
  • 将编译命令更改为:

    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
    
  • 我将动态库复制到项目中,并验证它是否作为捆绑资源复制

  • 运行我的应用程序时,在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 -TV libRatings.A.dylib**
    libRatings.A.dylib:
    Table of contents (0 entries)
    module name      symbol name
    
    nm的结果是:

        **>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
    
    谁能告诉我我做错了什么


    谢谢

    的确,似乎没有办法进行动态加载


    我只是用了静态链接

    实际上,似乎没有办法进行动态加载


    我只是用了静态链接

    您不能在iOS或tvOS上动态加载代码。谢谢。我选择使用静态链接来代替…也许你可以用这个技巧来做到:你不能在iOS或tvOS上动态加载代码。谢谢。我选择了使用静态链接…也许你可以使用以下技巧: