导航:首页 > 源码编译 > 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编译静态库相关的资料

热点内容
机器人编程方法 浏览:990
表盘编程gt 浏览:7
java源代码阅读 浏览:734
程序员用什么键盘罗技 浏览:167
为什么安卓手机每天都要更新app 浏览:705
java怎么成为程序员 浏览:288
西门子s7200编程电缆怎么连接 浏览:530
下载网页中的pdf文件 浏览:87
音乐缓存文件夹的软件 浏览:394
Dkms编译打印机驱动 浏览:992
解压缩文件操作异常 浏览:556
等待代码编译时你会干嘛 浏览:493
单片机c语言中变量右移8位 浏览:81
解压的一个小短片 浏览:831
二级压缩空压机哪家好排行 浏览:743
基于单片机超声波测距 浏览:130
模拟随机红包算法 浏览:386
程序员接外包网站 浏览:135
哪里可以买拆车件app 浏览:992
限流算法漏桶和令牌桶区别 浏览:316