代码改变世界

face++静态库转为动态库之二

  jiangys  阅读(781)  评论(0编辑  收藏  举报

上一篇的时候,已经介绍了如何将carthage转为动态库。这一篇,我们是单纯的建一个动态库。还是以face++为例

查看上一篇: face++静态库转为动态库

制作动态库

1、创建一个工程MGLiveDetect

创建成功后如下图,并删除多出来的MGLiveDetect.h

2、将Face++下面的三个文件,拉进工程

  • MGFaceIDBaseKit.framework
  • MGFaceIDLiveDetect.framework
  • MGFaceIDLiveCustomDetect.bundle

并将MGFaceIDLiveDetect.framework下面的几个头文件拉出来

保证拉出来的文件路径是一样的,都是指向 MGFaceIDLiveDetect.framework --> Headers里面

3、修改framework的Deployment Target支持8.0以上

4、配置你的framework

  1. 工程 -> 选择framework所在的Target -> 选择Build Phases
  2. 点击Header左下角的+号把你要暴露的头文件添加到Public里面(默认添加到Project里面,用鼠标把它拽过去)
  3. 在Compile source里面添加实现的.m文件。由于没有.m文件,可以直接忽略掉
  4. 在Link Binary With Libraries 中,将libs的文件全部增加进去,同时,还需要将demo里所有依赖的系统framework也增加进去。

5、配置类别和支持的Bitcode

  • Mach-O Type要选择Dynamic Library
  • Buld Setting中Build Active Architecture Only 选Release为 No (默认就是NO)
  • 在Build Settings的Linking的Other Linker Flags里加上 -all_load
  • 工程需要支持bitcode,需要在Other C Flags 里加上 -fembed-bitcode

说明:如果你使用了类别,那么你需要在Build Settings的Linking的Other Linker Flags里加上。为了避免麻烦,直接改为 -all_load

6、face++特殊配置(其它可以忽略)

face++的静态库是采用Objective-C++的方式来实现,还需要再指定编译方式。

因此,我们需要改一下如下配置

7、配置支持真机和模拟器

第一步:新建一个脚本

第二步,填入脚本

相关的脚本

复制代码
# Type a script or drag a script file from your workspace to insert its path.
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
复制代码

8、编译

选择真机编译模式,按 command + shift + B 快捷键编译,就会直接生成动态库 MGLiveDetect.framework

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2011-04-22 C#时间格式转换、日期操作函数、常用转换语法
点击右上角即可分享
微信分享提示