framework静态库 - ShenYj/ShenYj.github.io GitHub Wiki

Framework静态库

既然.a.o的集合, .framework.a的包装, 那么说明.a就是.framework的核心


探究: 手动将.a包装成一个Framework静态库

一、准备

  1. OCStaticLib文件夹下准备libOCTest.a静态库

    .
    ├── OCTest.h
    ├── OCTest.m
    ├── OCTest.o
    └── libOCTest.a
  2. 完整的文件目录结构

    .
    ├── Frameworks  (用来存放一会生成的`Framework`静态库)
    ├── OCStaticLib
    │   ├── OCTest.h
    │   ├── OCTest.m
    │   ├── OCTest.o
    │   └── libOCTest.a
    └── test.m
    • 补充
      • OCStaticLib是用来准备生成libOCTest.a的, 示例会利用一个.a手动创建成Framework静态库
      • test.m用来验证Framework是否创建成功
      • Frameworks路径用来存放静态库, 在链接成直接文件时, 指定路径这一项更直观

二、将.a手动包装成Framework静态库

  1. 新建一个文件夹, 命名为OCTest.framework

  2. OCTest.framework中新建子文件夹Headers

  3. 将上面的OCTest.h复制到Headers

  4. 将上面的libOCTest.a复制到OCTest.framework

    • 目录结构

      .
      ├── Headers
      │   └── OCTest.h
      └── libOCTest.a
  5. 去掉.a后缀

  6. 去掉lib前缀

    • 最后OCTest.framework目录结构

      .
      ├── Headers
      │   └── OCTest.h
      └── OCTest.a

三、验证

  1. 利用外层的test.m链接Framework静态库, 生成.o目标文件

    clang -x objective-c \
    -target x86_64-apple-macos11.1 \
    -fobjc-arc \
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk \
    -I./Frameworks/OCTest.framework/Headers \
    -c test.m \
    -o test.o
  2. 链接Framework静态库生成执行文件

    clang -target x86_64-apple-macos11.1 \
    -fobjc-arc \
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk \
    -F./Frameworks \
    -framework OCTest \
    test.o -o test
  3. lldb下运行可执行文件

    1. 进入lldb环境

      lldb
    2. 包装成target

      (lldb) file test
      Current executable set to '/Users/shenyj/Documents/CodeForTest/lib/staticFramework/test' (x86_64).
    3. 运行target

      (lldb) r
      Process 58403 launched: '/Users/shenyj/Documents/CodeForTest/lib/staticFramework/test' (x86_64)
      2021-01-25 16:49:54.145561+0800 test[58403:1826528] __TestExample
      2021-01-25 16:49:54.145836+0800 test[58403:1826528] testApp ------
      Process 58403 exited with status = 0 (0x00000000)
⚠️ **GitHub.com Fallback** ⚠️