链接AFN .a静态库

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

使用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+的动态库,找不到,再去找lib+的静态库,还找不到,就报错

  2. 执行验证

    在终端内运行可执行文件

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

    通过输出结果验证:

    1. 引入AFN并没有报错
    2. NSLog(@"testApp ------");被执行