導航:首頁 > 源碼編譯 > swift編譯靜態庫

swift編譯靜態庫

發布時間:2023-01-01 15:28:40

① 如何在Swift中調用C庫

這些項目都是運行在linux平台下,我們來看看如何將這個示例兼容Mac平台。

在Mac上安裝Reids和Hiredis

使用Homebrew來安裝:
brew install redis hiredis

然後使用下面命令運行redis:
redis-server /usr/local/etc/redis.conf

修改hiredis-bridge

主要是要修改hiredis-bridge的Makefile
TARGET = hiredis_bridge
LIB_NAME = hiredis_bridge

PREFIX ?= /usr/local

UNAME := $(shell uname)

all: $(TARGET)

$(TARGET): *.c
ifeq ($(UNAME), Linux) # build for linux
clang -c *.c
ar -rcs lib$(LIB_NAME).a *.o
endif
ifeq ($(UNAME), Darwin) # build for darwin
clang -c *.c -I$(PREFIX)/include
clang -dynamiclib *.o -I$(PREFIX)/include $(PREFIX)/lib/libhiredis.dylib -o lib$(LIB_NAME).dylib
endif
rm *.o

install:
mkdir -p $(TARGET)/usr/local/lib
mkdir -p $(TARGET)/usr/local/include/$(TARGET)
cp *.h $(TARGET)/usr/local/include/$(TARGET)
ifeq ($(UNAME), Linux)
# .a
cp lib$(LIB_NAME).a $(TARGET)/usr/local/lib/
rm lib$(LIB_NAME).a
endif
ifeq ($(UNAME), Darwin)
# .dylib
cp lib$(LIB_NAME).dylib $(TARGET)/usr/local/lib/
rm lib$(LIB_NAME).dylib
endif
mkdir -p $(PREFIX)
cp -r $(TARGET)/usr/local/* $(PREFIX)/
rm -r $(TARGET)

Makefile主要作用是編譯,然後把hiredis-bridge的頭文件和庫文件放到對應的位置上去。不過因為Linux和Mac環境的區別,編譯的方法會不一樣。Linux編譯出來是靜態庫,後綴為.a;Mac需要編譯出動態庫,後綴為.dylib。然後都會把頭文件(.h)放到/usr/local/include/目錄下,庫文件(.a或.dylib)放到/usr/local/lib/目錄下。

代碼更新到github上: https://github.com/fengluo/hiredis-bridge/tree/
tag: 0.2.0

創建CHiredis-OSX

hiredis在Linux和Mac下的安裝位置不一樣。Linux下,hiredis的頭文件位置在/usr/include/,而Mac下則位於/usr/local/include/。SPM(Swift Package Manager)在 文檔
中有提到過這個問題,並聲稱會在將來解決。我們現在的解決方法則是創建一個新的映射庫。

只要把之前的 CHiredis
復制過來,修改mole.molemap中的header路徑即可:
mole CHiredis [system] {
header "/usr/local/include/hiredis/hiredis.h"
header "/usr/local/include/hiredis_bridge/hiredis-bridge.h"
link "hiredis"
link "hiredis_bridge"
export *
}

並且需要在Package.swift中定義包的名稱,否則編譯後這個包會以CHiredis-OSX為名出現。
import PackageDescription

let package = Package(
name: "CHiredis"
)

代碼上傳到github上: https://github.com/fengluo/CHiredis-OSX
tag: 0.2.0

修改SwiftHiredis

在SwiftHiredis,我們需要基於現在的系統平台來選擇依賴的映射庫:CHiredis or CHiredis-OSX。只要簡單的改動即可:
import PackageDescription

#if os(OSX)
let CHiredisURL = "https://github.com/fengluo/CHiredis-OSX.git"
#else
let CHiredisURL = "https://github.com/fengluo/CHiredis.git"
#endif

let package = Package(
dependencies: [
.Package(url: CHiredisURL, majorVersion: 0, minor: 2)]
)

這樣對於該示例的跨平台兼容就解決了。在SwiftHiredis編譯運行測試一下:
swift build
.build/debug/SwiftHiredis

就會得到上篇文章一樣的結果 1234

② iOS 靜態庫和動態庫打包framework流程(純swift版/swift、OC混編版)

選擇 iOS -- Framework&Library , 點擊 next

如果打包文件中使用了第三方庫,建議pod管理,並告知用戶使用pod安裝,避免用戶重復導入。跟平時開發邏輯一樣,打開 .xcworkspace 工程。

操作完之後工程目錄顯示

把打包需要的文件添加到項目中。 如果想要這個類或類裡面的方法被外面使用,需要配合pubic修飾供外面使用

由於以上獲取的framework只能在對應的版本上運行(即真機只能在設備上運行模擬器版本只能在模擬器上面運行使用),所以需要合並framework版本。
合並framework版本:
sudo lipo -create (此處請填寫真機AppVest文件路徑) (此處填寫模擬器AILLSDK文件路徑) -output 自定義合成文件存儲路徑(合成文件的名字AILLSDK)

因為真機版本和模擬器版本的framework都存在arm64架構,導致架構重復,不出意外,會提示合並失敗。如下

處理合並失敗的問題

最後,將 XX.framework(真機或者模擬器framework都可)文件夾 拷貝出來,替換AILLSDK(本文使用的)為剛才合並的新文件。
查看替換後的framework支持全部真機模擬器架構。

我在合並binary文件之後,僅拷貝出 Release-iphoneos 文件夾下的 XXX.framework ,並替換掉AILLSDK二進制文件。導入項目中使用模擬器運行,報錯,顯示找不到架構。

解決方案

拷貝所有的moles到

再替換掉AILLSDK二進制文件,導入項目,如果framework中內含第三方庫,需要在所在的工程中使用pod載入,否則會提示編譯失敗。
至此,編譯成功。🎉🎉🎉🎉🎉

不管是在framework封裝的內部,內部swift類調用內部的OC類,還是內部的OC類使用內部的swift類,還是外部工程swift類使用framework內部OC類,還是外部工程OC類使用framework內部swift類。原理是一致的,以下來介紹下:

在 AILLSDK.h(你自己創建framework時候生成的.h文件) 中添加import導入
#import <AILLSDK/OC類名.h>

在oc的 .m 或 .h 文件中,導入 #import <AILLSDK/AILLSDK-Swift.h> , 也就是 你自己framework名-Swift.h

閱讀全文

與swift編譯靜態庫相關的資料

熱點內容
如何設置內網伺服器IP 瀏覽:74
馬老師的加密通話視頻 瀏覽:743
掃碼識價app哪裡可以買 瀏覽:551
wpstopdf轉換器 瀏覽:639
怎麼把pdf導入iphone 瀏覽:565
7z後綴文件解壓縮 瀏覽:904
伺服器為什麼禁用三叉戟 瀏覽:934
解壓小視頻卸妝或化妝 瀏覽:555
太監程序員 瀏覽:56
java編譯選項包括 瀏覽:433
安卓手機如何導其他手機的通訊錄 瀏覽:931
離心式壓縮機品牌 瀏覽:167
plc編程推薦什麼電腦 瀏覽:936
安卓最新什麼系統版本 瀏覽:193
甜顏app真人交友在哪裡下載 瀏覽:335
電腦里好亂很多文件夾都是空 瀏覽:352
數學一竅不通可以學模具編程嗎 瀏覽:271
退休程序員練字 瀏覽:693
海光伺服器什麼架構 瀏覽:138
戰斗命令要素 瀏覽:953