链接AFN .a静态库 - ShenYj/ShenYj.github.io GitHub Wiki

使用clang链接AFN .a静态库

AFN静态库的生成不是重点, 以链接使用为主


一、准备

  1. staticLib文件夹下新建test.m文件, 代码如下

    #import <Foundation/Foundation.h>
    #import <AFNetworking.h>
    
    int main() {
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        NSLog(@"testApp ------");
        return 0;
    }
    • 便于调试, 新建一个macOS项目, 利用Podfile生成AFN.a静态库
      • pod 'AFNetworking', :modular_headers => true
  2. 代码说明:

    1. 使用了AFN
    2. NSLog执行了一条输出语句
  3. 目录结构:

    .
    ├── AFNetworking
    │   ├── AFCompatibilityMacros.h
    │   ├── AFHTTPSessionManager.h
    │   ├── AFHTTPSessionManager.m
    │   ├── AFNetworkReachabilityManager.h
    │   ├── AFNetworkReachabilityManager.m
    │   ├── AFNetworking.h
    |   ├── libAFNetworking.a
    │   ├── AFSecurityPolicy.h
    │   ├── AFSecurityPolicy.m
    │   ├── AFURLRequestSerialization.h
    │   ├── AFURLRequestSerialization.m
    │   ├── AFURLResponseSerialization.h
    │   ├── AFURLResponseSerialization.m
    │   ├── AFURLSessionManager.h
    │   └── AFURLSessionManager.m
    └── test.m
    
    1 directory, 15 files

二、将libAFNetworking.a这个静态库链接到test.m文件, 生成.o目标文件

  1. 先将test.m文件编译成.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./AFNetworking \
    > -c test.m -o test.o
    
    • clang命令参数

      -x: 指定编译文件语言类型
      -target: 指定指令集(-target arm64-apple-ios14.3 真机)
      -g: 生成调试信息
      -c: 生成目标文件,只运行preprocess,compile,assemble,不链接
      -o: 输出文件
      -isysroot: 使用的SDK路径
          1. -I<directory> 在指定目录寻找头文件 (header search path)
          2. -L<dir> 指定库文件路径(.a\.dylib库文件) (library search path)
          3. -l<library_name> 指定链接的库文件名称(.a\.dylib库文件)(other link flags -lAFNetworking)  
          4. -F<directory> 在指定目录寻找framework (framework search path)
          5. -framework <framework_name> 指定链接的framework名称 (other link flags -framework AFNetworking)  
    • 生成目标文件时, 会根据重定位符号表重定位

      • -I告诉了AFN头文件路径
      • 目标文件.o中有一个重定位符号表, 保存了当前文件使用所有的符号, 链接的时候根据重定位符号表获取符号信息

三、将.o文件生成可执行文件

  1. 生成执行文件(注意链接的.a架构统一)

    clang -target x86_64-apple-macos11.1 \
    -fobjc-arc \
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk \
    -L./AFNetworking \
    -lAFNetworking \
    test.o -o test
    • 查找规则

      先找lib+<library_name>的动态库,找不到,再去找lib+<library_name>的静态库,还找不到,就报错

  2. 执行验证

    在终端内运行可执行文件

    ❯ ./test
    2021-01-24 21:48:27.576 test[38931:1364549] testApp ------

    通过输出结果验证:

    1. 引入AFN并没有报错
    2. NSLog(@"testApp ------");被执行
⚠️ **GitHub.com Fallback** ⚠️