問(wèn)題描述
在SDK私有庫(kù)開(kāi)發(fā)過(guò)程中, 需要依賴一個(gè)Adyen支付庫(kù), swift的寫(xiě)的, 所以打開(kāi)了use_frameworks!這個(gè)時(shí)候項(xiàng)目一切正常.
后面改了需求:所有的庫(kù)必須打包成靜態(tài)庫(kù)然后鏈接到主程序中, pod從1.5.0開(kāi)始剛好也支持靜態(tài)庫(kù), 于是注釋use_frameworks!, 打開(kāi)use_modular_headers!

問(wèn)題1.鏈接cocos2d的時(shí)候出錯(cuò), 有幾個(gè)符號(hào)找不到

記錄下解決這個(gè)問(wèn)題的過(guò)程
- 私有庫(kù)整個(gè)直接打包成.a靜態(tài)庫(kù), 中間因?yàn)閳?bào)錯(cuò), 放棄
- 將Adyen直接打包成.a靜態(tài)庫(kù), 問(wèn)題依舊
- 那幾個(gè)符號(hào)是Google的Webp的, 于是私自鏈接Webp靜態(tài)庫(kù)到項(xiàng)目, 問(wèn)題依舊
- 最后全局搜索了Webp, 在.xcconfig中發(fā)現(xiàn)了這個(gè)

是YYKit中依賴了Webp.framwork

猜測(cè)是不是這個(gè)和cocos2d.a中的符號(hào)產(chǎn)生了沖突, 最終證明是對(duì)的, 改為單獨(dú)集成YY中的組件, 未知符號(hào)的報(bào)錯(cuò)終于消失??

問(wèn)題2.swift 靜態(tài)庫(kù)NSClassFromString為nil?
Adyen支付流程異常, 支付也一直失敗, ??看來(lái)Adyen這源碼寫(xiě)得不支持swift靜態(tài)庫(kù)啊
經(jīng)過(guò)斷點(diǎn)調(diào)試pluginClass為nil, 測(cè)試代碼也發(fā)現(xiàn)34行classB為nil, 原因也出在這

但是當(dāng)經(jīng)過(guò)32行初始化一個(gè)CardPlugin類之后, classB正常

有好幾種情況會(huì)導(dǎo)致這樣
- swift中需要NSClassFromString(moduleName + "." + "ClassName")使用
- Other Linker Flags 添加 ''-ObjC"
- .m沒(méi)有參與編譯(Compile Sources 添加即可) .m中忘記寫(xiě)@implementation
而我的項(xiàng)目中Other Linker Flags這個(gè)是必加選項(xiàng)(經(jīng)驗(yàn), 經(jīng)驗(yàn)), 也由此受到啟發(fā), 決定添加-force_load一試
-force_load ${PODS_CONFIGURATION_BUILD_DIR}/Adyen/libAdyen.a

??搞定!!!
問(wèn)題疑惑(有大佬幫解答寫(xiě)咩)
2個(gè)問(wèn)題說(shuō)是解決了, 但是本質(zhì)的原因還是沒(méi)搞明白
為什么同時(shí)鏈接webp.framework靜態(tài)庫(kù)和cocos2d.a會(huì)有沖突, 導(dǎo)致coco2d中的幾個(gè)符號(hào)找不到
-
為什么.xcconfig中鏈接了adyen, 還是需要進(jìn)行force_load
image.png
關(guān)于-all_load的
Reference:
IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes.
The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code.
-force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive,and every object file in that archive will be loaded.
翻譯如下:
引用:
不過(guò)在64位的Mac系統(tǒng)或者iOS系統(tǒng)下,鏈接器有一個(gè)bug,會(huì)導(dǎo)致只包含有類別的靜態(tài)庫(kù)無(wú)法使用-ObjC標(biāo)志來(lái)加載文件。變通方法是使用-all_load 或者-force_load標(biāo)志,它們的作用都是加載靜態(tài)庫(kù)中所有文件,不過(guò)all_load作用于所有的庫(kù),而-force_load后面必須要指定具體的文件。
解釋:
這個(gè)flag是專門(mén)處理-ObjC的一個(gè)bug的。用了-ObjC以后,如果類庫(kù)中只有category分類但是沒(méi)有類的時(shí)候,這些category分類還是加載不進(jìn)來(lái)。
變通方法就是加入-all_load或者-force-load。
但根據(jù)CardPlugin的定義, 也不像是上面的那種情況

