framework静态库

优质
小牛编辑
114浏览
2023-12-01

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)