常見庫文件格式
-
.a
:靜態(tài)庫 -
.dylib
:動態(tài)庫 -
.framework
:動肴熏、靜態(tài)庫 -
.xcframework
:針對不同架構(gòu)的動赂蠢、靜態(tài)庫
靜態(tài)庫
靜態(tài)庫是.o
文件的合集
我們可以通過ar -t
命令來驗證
image.png
- 新建一個
test.m
文件腾供,并在同級目錄下放入AFNetworking靜態(tài)庫
#import <Foundation/Foundation.h>
#import <AFNetworking.h>
int main(){
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSLog(@"testApp----%@", manager);
return 0;
}
image.png
.m文件編譯成.o文件
我們通過clang
命令來完成編譯
- 我們在生成目標文件的時候只需要頭文件的路徑,因為鏈接器會根據(jù)重定位符號去查找對應的符號
clang -x objective-c \ //指定oc語言
-target x86_64-apple-macos11.1 \ //指定生成的是X86_64_macOS架構(gòu)的代碼
-fobjc-arc \ //使用ARC
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \ //指定SDK的路徑
-I./AFNetworking \ //在指定目錄尋找頭文件 header search path
-c test.m -o test.o //輸出目標文件.o
.o文件鏈接靜態(tài)庫 生成可以執(zhí)行文件
clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-L./AFNetworking \ //指定庫文件路徑(.a\.dylib庫文件) library search path
-lAFNetworking \ //指定鏈接的庫文件名稱(.a\.dylib庫文件)other link flags -lAFNetworking
test.o -o test
- 生成的可執(zhí)行文件,我們在終端通過
lldb
來執(zhí)行
//1恋追、
lldb
//2、
file test
//3颅崩、
run
.o文件轉(zhuǎn)換成靜態(tài)庫
ar
壓縮目標文件几于,并對其進行編號和索引,形成靜態(tài)庫沿后。同時也可以解壓縮靜態(tài)庫沿彭,查看有哪些目標文件:
ar -rc bbb.a bbb.o -- 將bbb.o轉(zhuǎn)換成靜態(tài)庫bbb.a
-r: -- 將bbb.a添加或者替換文件
-c: -- 不輸出任何信息
-t: -- 列出包含的目標文件
靜態(tài)庫合并
libtool -static -o <輸出的靜態(tài)庫名字> <需要合并的靜態(tài)庫> <需要合并的靜態(tài)庫>
Framework
Framework是一種打包方式,將庫的二進制尖滚、頭文件和資源文件打包到一起喉刘,方便管理和分發(fā)
Framework和系統(tǒng)的Framework有很大區(qū)別,系統(tǒng)的Framework不需要拷貝到目標程序漆弄,自己做的Framework最終都是要拷貝到App中(App和Extension的Bundle是共享的)睦裳,因此又稱為Extension Framework
Framework
手動創(chuàng)建一個Framework
-
新建
TestExample.h
和TestExample.m
image.png 通過下面命令將
TestExample.m
編譯成TestExample.o
clang -x objective-c \
-target x86_64-apple-macos11.3 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-c TestExample.m -o TestExample.o
image.png
- 通過
ar
命令將TestExample.o
轉(zhuǎn)換成 靜態(tài)庫TestExample.a
ar -rc TestExample.a TestExample.o
image.png
-
按照圖中目錄結(jié)構(gòu)將文件添加進去
image.png
下面我們通過鏈接Framework來測試是否成功
- 新建
test.m
#import <Foundation/Foundation.h>
#import "TestExample.h"
int main(){
NSLog(@"testApp----");
// TestExample *manager = [TestExample new];
// [manager lg_test: nil];
return 0;
}
image.png
- 通過下面命令將
test.m
鏈接成test.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.3.sdk \
-I./Framework/TestExample.framework/Headers \
-c test.m -o test.o
-
test.o
鏈接TestExample.framework
生成可以執(zhí)行文件
clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-F./Framework \
-framework TestExample \
test.o -o test
image.png
- 進入
lldb
環(huán)境,運行可執(zhí)行文件
image.png
總結(jié)
clang命令參數(shù):
-x: 指定編譯文件語言類型
-g: 生成調(diào)試信息
-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
-F<directory> 在指定目錄尋找framework framework search path
-framework <framework_name> 指定鏈接的framework名稱 other link flags -framework AFNetworking
//靜態(tài)庫合并
libtool -static -o <OUTPUT NAME> <LIBRARY_1> <LIBRARY_2>
//.o文件生成靜態(tài)庫
//`ar`壓縮目標文件蛛蒙,并對其進行編號和索引,形成靜態(tài)庫渤愁。同時也可以解壓縮靜態(tài)庫牵祟,查看有哪些目標文件:
ar -rc a.a a.o
-r: 像a.a添加or替換文件
-c: 不輸出任何信息
-t: 列出包含的目標文件
shell腳本
SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk
FILE_NAME=test
HEADER_SEARCH_PATH=./StaticLibrary
echo "-----開始編譯test.m"
clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-I${HEADER_SEARCH_PATH} \
-c ${FILE_NAME}.m -o ${FILE_NAME}.o
echo "-----開始進入StaticLibrary"
pushd ./StaticLibrary
clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-c TestExample.m -o TestExample.o
ar -rc libTestExample.a TestExample.o
echo "-----開始退出StaticLibrary"
popd
echo "-----開始test.o to test EXEC"
clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-L./StaticLibrary \
-lTestExample \
${FILE_NAME}.o -o ${FILE_NAME}