链接AFN .a静态库
优质
小牛编辑
125浏览
2023-12-01
使用clang
链接AFN
.a
静态库
AFN
静态库的生成不是重点, 以链接使用为主
一、准备
在
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
- 便于调试, 新建一个
代码说明:
- 使用了
AFN
NSLog
执行了一条输出语句
- 使用了
目录结构:
. ├── 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
目标文件
先将
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
文件生成可执行文件
生成执行文件(注意链接的
.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+的静态库,还找不到,就报错
执行验证
在终端内运行可执行文件
❯ ./test 2021-01-24 21:48:27.576 test[38931:1364549] testApp ------
通过输出结果验证:
- 引入
AFN
并没有报错 NSLog(@"testApp ------");
被执行
- 引入