iOS   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了xcode – 将静态框架转换为动态大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我想将静态iOS框架( https://github.com/comScore/ComScore-iOS-watchOS-tvOS/tree/master/ComScore/iOS)转换为动态. > clang -arch x86_64 -dynamiclib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhone
我想将静态iOS框架( https://github.com/comScore/ComScore-iOS-watchOS-tvOS/tree/master/ComScore/iOS)转换为动态.

> clang -arch x86_64 -dynamiclib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhonesimulator.platform/Developer/SDKs/iPhonesimulator10.3.sdk -lc -F. -framework Comscore -ObjC -o ComscoreDynamic

此命令成功,但是符号可见性存在问题.

当我检查原始框架中的符号时,它是大约4k的公共符号:

> nm -gU Comscore.framework / Comscore | wc -l
4387

在动态版本中,只有极少数:

nm -gU ComscoreDynamic
0000000000114af8 S _OBJC_CLASS _ $_ SCORCommonUtils
0000000000114940 S _OBJC_CLASS _ $_ SCORCrossPublisherIdsourceValue
0000000000114a08 S _OBJC_CLASS _ $_ SCORhttp
0000000000114990 S _OBJC_CLASS _ $_ SCORHelper
0000000000114aa8 S _OBJC_CLASS _ $_ SCORObfuscation
0000000000114a80 S _OBJC_CLASS _ $_ SCORReachability
0000000000114918 S _OBJC_CLASS _ $_ SCORUniquEID
0000000000114b20 S _OBJC_MetaCLASS _ $_ SCORCommonUtils
00000000001149e0 S _OBJC_MetaCLASS _ $_ SCORCrossPublisherIdsourceValue
0000000000114a30 S _OBJC_MetaCLASS _ $_ SCORhttp
0000000000114968 S _OBJC_MetaCLASS _ $_ SCORHelper
0000000000114ad0 S _OBJC_MetaCLASS _ $_ SCORObfuscation
0000000000114a58 S _OBJC_MetaCLASS _ $_ SCORReachability
00000000001149b8 S _OBJC_MetaCLASS _ $_ SCORUniquEID
00000000001166b0 D __ZTinSt3__117bad_function_callE
00000000000d5d60 S __ZTSNSt3__117bad_function_callE

所有其他符号标记为内部(t和s标记).

如何将符号保持在外部?

更新:

看起来这可能是类似的问题:Export an `OBJC_CLASS` from one static lib as part of another

问题是静态库中的符号被导出为private_extern,并且无法在动态库中保留它们.

解决方法

comscore框架中的公共符号标记为private external.这可以通过nm实用程序查看并查找SCORAnalytics类:

nm -m Comscore/iOS/Comscore.framework/Versions/A/Comscore  |grep _OBJC_CLASS_\$_SCORAnalytics

显示

---------------- (LTO,DATA) private external _OBJC_CLASS_$_SCORAnalytics

这意味着符号只能链接一次.当Cocoapods执行辅助(“传递”)依赖关系的预链接时,这些符号将失去其extern属性.这里的想法是防止依赖的公共符号泄漏到另一个库的那些符号.问题是,对于Swift项目,直到最终的应用程序链接才能完全解决它们;到那时他们已经不再可用了.

真正的问题是comscore库是一个静态框架.最好的解决方案是让comscore将其作为动态框架发布,但这些只有iOS 8及更高版本支持; comscore一直坚持支持iOS 6.我知道.

目前,我的解决方案是将comscore框架直接包含在我们的Cocoapod中,并在Podspec中进行销售,使其能够与Obj-C和Swift项目一起使用.缺点是每次comscore发布新版本时我都必须手动更新我们的Cocoapod.如果另一个pod包含comscore,也会出现符号冲突,但由于我们的pod是一个记录到多个后端的度量聚合器,因此它可能是唯一使用的度量组件.因人而异.

大佬总结

以上是大佬教程为你收集整理的xcode – 将静态框架转换为动态全部内容,希望文章能够帮你解决xcode – 将静态框架转换为动态所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。