iOS 多个动态库依赖相同静态库问题

一.背景

最近遇到一个问题,如下。

objc[18116]: Class GPBBoolBoolDictionary is implemented in both xx/QLVPlatformFramework (0x1113481b0) and xx/QLVEngineFramework (0x10fde7108). One of the two will be used. Which one is undefined.

问题很简单,是一个类在两个动态库都有实现。搜一下这个类,是一个静态库的,libDynamicA和libDynamicB都依赖了这个libStatic。虽然不报错,但是多了之后,build后打印的信息都是这个,还是挺烦的。之前只有一个没怎么管,但是现在有了这么多还是要解决下。

二.解决

解决也很简单,libDynamicA引用了libDynamicB。动态库在导入静态库时会把静态库的符号重新导出,所以只要libDynamicA去掉libStatic的引用就行了。

当我试了之后,却在libDynamicA报错符号找不到。原来是libDynamicB只用到了libStatic的部分符号,所以也只引入了这部分。

那就在libDynamicB使用-ObjC或者-all_load就行了,把所有符号都导入进来。

但我觉得太粗暴了,-force_load可以把指定的目标文件符号都导入进来。这里还有个需要注意的,libStatic是工程的一个target,而不是编译好的二进制,所以路径要使用$(BUILD_DIR)/$(CONFIGURATION)/libStatic.a。

但是最后解决方法不是我上面的说的,交给同事解决后,正好有一个libDynamicC被A和B依赖,所以就把libStatic放到C里面,而且正好C依赖的库少,所以使用-ObjC。

你可能感兴趣的:(iOS开发,ios,动态库,静态库,依赖)