Xcode 将静态框架转换为动态框架

Xcode 将静态框架转换为动态框架,xcode,clang,ld,comscore,Xcode,Clang,Ld,Comscore,我想将静态iOS框架()转换为动态 >clang-arch x86_64-dynamiclib-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk-lc++-F-框架ComScore-ObjC-o ComScoreDynamic 此命令成功,但符号可见性存在问题 当我检查原始框架中的符号时,大约有4

我想将静态iOS框架()转换为动态

>clang-arch x86_64-dynamiclib-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk-lc++-F-框架ComScore-ObjC-o ComScoreDynamic

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

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

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

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

nm-动态的
0000000000 114AF8 S_OBJC_CLASS_u$_scorcomunitils 0000000000 114940 S_OBJC_类$_SCORCrossPublisherIdSourceValue 0000000000 114A08 S_OBJC_类$_SCORHTTP 0000000000 114990 S_OBJC_类u$\u 0000000000 114AA8 S_OBJC_CLASS_u$_模糊化 0000000000 114A80 S_OBJC_类u$_可达性 0000000000 114918 S_OBJC_CLASS_u$_SCORUniqueId 0000000000 114B20 S_对象JC_元类$_scorcomonutils 0000000000 1149E0 S_对象JC_元类$_SCORCrossPublisherIdSourceValue 0000000000 114A30 S_OBJC_元类u$\u SCORHTTP 0000000000 114968 S_OBJC_元类$\u 0000000000 114AD0 S_OBJC_元类$_模糊化 0000000000 114A58 S_OBJC_元类u$_可达性 0000000000 1149B8 S_OBJC_元类$_SCORUniqueId 0000000000 1166b0 D_uuuztinst3_uuu117bad_u函数调用 00000000000d5d60 S\uuuuuztsnst3\uuuuu117bad\u函数调用

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

如何将符号保存在外部

更新:

看起来这可能是类似的问题:


问题是静态库中的符号被导出为
private\u 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是一个登录到多个后端的度量聚合器,因此它可能是唯一使用的度量组件。YMMV.

您不需要将库中的所有内容都设置为外部。制作适当的dynamic.framework和模块导出,感谢您的回复!据我所知,module.map只影响编译时间,我在链接阶段遇到了一个问题。如果我要创建自定义模块映射,它会影响生成的库吗?另外,在常规动态框架的Xcode link命令中,我看不到对模块映射的任何引用。正如您所看到的,符号并没有被剥离,所以ObjC运行时将找到它们。你为什么认为这是个问题?如何使用动态库?我在将此动态库链接到我的应用程序时收到错误:
架构armv7的未定义符号:“_OBJC_CLASS_$_scoredRequirementsStreamingAnalytics
在原始库中,此符号标记为外部:
------------D\u OBJC\u CLASS\u$\ u scoreducedRequirementsStreamingAnalytics
并且是动态内部的:
0000000000 11AAC0 s\u OBJC\u CLASS\u$\ u scoreducedRequirementsStreamingAnalytics
,因此仍然需要外部的类名。那很有趣。