猫哥不懂技术

莫催稿,催稿也不交

解决 iOS 中多个 CodeTyphon 静态库编译冲突

使用 CodeTyphon 开发 iOS 的静态库时,如果是单一库,不会出现问题,而当多个静态库同时被链接时,情况就不太妙了,会出现 duplicate symbols的异常,而查代码下来,却又找不到重复之处,这是怎么回事呢?


其实根本原因是,CodeTyphon 在链接 .a 时,会把一些系统固有的东西一起链接上,也就是类似于 classes.osysutils.o 这类的单元有多份,因此而产生的冲突。那么要解决冲突,最好的办法就是让这些通用的东西只存在一份。

所以写个脚本来搞定:

#!/bin/sh
for a in *.a;
do
    lipo $a -thin arm64 -o "${a}_arm64.a"
    ar -x "${a}_arm64.a"
    rm "${a}_arm64.a"
done

ar -q libmerged.a *.o

这样就得到了一个合并后的 .a,它仅包含各个原始 .a 内不同的部分,相同的部分已被合并。在编译时,可以直接导入 libmerged.a,同时把其他的 .a 删除。


另外需要注意的是,由于静态库的代码是全局有效的,合并后的代码依然这样,所以在静态库内若是有重名的全局函数,全局变量等,合并后依然会出错,这就需要在开发时小心,在全局函数命名时,同时加入模块名称作为前缀会让模块变得更靠谱。

上述脚本中,使用的架构是 arm64,而通常情况下,我们还需要面对 armv7, x86_64, i386 这三种架构,在脚本中修改一下即可,最后别忘了把各种架构的 libmerged.a 再次合并到一起。


发表评论:

Powered By Z-BlogPHP 1.5.1 Zero

Copyright Rarnu 2017. All Rights Reserved.