使用.a静态库

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

使用.a静态库

ar生成.a静态库

利用这里制作的.a静态库, 来链接使用这个.a静态库, 并验证这一切是否如预期那样

同样的, 继续通过clang直接操作, 更便于理解IDE底层执行的过程


一、前期准备

  • 准备了一个test.m文件, 用来链接.a静态库并生成可执行文件, 观察运行结果
  • 代码

      #import <Foundation/Foundation.h>
      #import "OCTest.h"
    
      int main() {
          NSLog(@"testApp ------");
    
          OCTest *lib = [OCTest new];
          [lib test:nil];
          return 0;
      }
    
  • 文件目录

      .
      ├── OCStaticLib
      │   ├── OCTest.h
      │   ├── OCTest.m
      │   └── libOCTest.a
      └── test.m
    

二、生成可执行文件

  • 这里我准备了一个脚本, 用来编译、链接成最后的可执行文件

      SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk
    
      # 链接libOCTest.a到test.m中生成.o文件
      clang -x objective-c \
      -target x86_64-apple-macos11.1 \
      -fobjc-arc \
      -isysroot $SYSROOT \
      -I./OCStaticLib \
      -c test.m \
      -o test.o
    
      # 将.o生成执行文件
      clang -target x86_64-apple-macos11.1 \
      -fobjc-arc \
      -isysroot $SYSROOT \
      -L./OCStaticLib \
      -lOCTest \
      test.o -o test
    
    • 参数说明
      • -I: -I<directory> 在指定目录寻找头文件, 等同于Build Setting设置header search path
      • -L: -L<dir> 指定库文件路径(.a.dylib库文件, 等同于Build Setting设置library search path
      • -l: -l<library_name> 指定链接的库文件名称(.a.dylib库文件), 等同于Build Setting设置other link flags -lAFNetworking
    • 这三个参数中间都没有空格

三、运行可执行文件

  • 在终端中直接进入lldb环境来运行可执行文件: 终端lldb环境运行可执行文件

    输出结果

      Process 35956 launched: '/Users/shenyj/Documents/CodeForTest/lib/staticOCLib/test' (x86_64)
      2021-01-27 10:15:38.286564+0800 test[35956:728432] testApp ------
      2021-01-27 10:15:38.286928+0800 test[35956:728432] __TestExample
      Process 35956 exited with status = 0 (0x00000000)
    

没有任何报错, 并且手动创建的.a方法被执行, 说明这个.a静态库被链接到可执行文件中并成功使用了