iOS framework 静态库 套娃🪆娃中娃
接到某个需求,需要把别人家的SDK封装一层,给到其他部门使用,... 啊这 这不就是套娃嘛
一开始以为很简单就直接拖入项目,添加各种依赖之后编译成功了,连真机调试就开始报错了
提示 Undefined symbols for xxxx
xxx_OBJC_Class_$__xxxx, referenced from xxx
ld: symbol(s) not found for archxxx arm64
找不到符号 , 文件找不到,也就是库的路径配置出错了
如何避免SDK
与其他framwork
依赖库冲突
- 修改命名避免重复,统一加上类前缀或者后缀,有的方案还使用
prefix.pch
加宏定义 内部解决alias
类名 C/C++
局部函数声明加上static
, 而全局的依然是需要注意命名问题
如果是.a
静态库的嵌套话,那就没啥问题了,把静态库可执行文件和头文件引入就ok了
a. framework + framework
因为framework
也是类似的,可以理解为是多封装了一层.framework
文件夹,而Xcode
比较睿智,有的时候并不会主动寻找三方类库的具体路径,所以有的时候有必要手动指定Library Search Path
以及Header Search Path
实际上这种方式,集成到宿主应用时还是得把依赖的三方framework拖入项目,不然也会提示找不到symbols
b. framework + (Headers + 可执行文件)
这是一种笨方法,直接把.framework文件拆出来,把可执行文件当.a静态库使用已经头文件一并拖入项目
这种方式实测有效, 多个静态库能够合并成为一个.framework的静态库,只是多了一个拆解的步骤
<!-- run -->
<div id="app">
<div>
<el-collapse v-model="active">
<el-collapse-item :title="title" name="1">
<pre :class=`language-${lang}`>
<code :class=`language-${lang}`> {{code}} </code>
</pre>
</el-collapse-item>
</el-collapse>
</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
active: '1',
title: '配置Path',
lang: 'bash',
code: `
#具体到某个.framework即可
$(PROJECT_DIR)/项目根目录名/xxx.framework
#当然也可以正则模糊匹配 所有三方.framework都放Libs目录下
$(PROJECT_DIR)/项目根目录名/Libs/*.framework
`
}
},
});
setTimeout(() => {
var codeNode = window.document.getElementsByTagName('code');
if (codeNode.childNodes.length === 0) {
window.location.reload();
}
}, 500);
</script>
未经作者授权,禁止转载
本文来自博客园,作者:CoderWGB,转载请注明原文链接:https://www.cnblogs.com/wgb1234/p/16673921.html
THE END