問題描述
在SDK私有庫開發(fā)過程中, 需要依賴一個Adyen支付庫, swift的寫的, 所以打開了use_frameworks!這個時候項目一切正常.
后面改了需求:所有的庫必須打包成靜態(tài)庫然后鏈接到主程序中, pod從1.5.0開始剛好也支持靜態(tài)庫, 于是注釋use_frameworks!, 打開use_modular_headers!
問題1.鏈接cocos2d的時候出錯, 有幾個符號找不到
記錄下解決這個問題的過程
- 私有庫整個直接打包成.a靜態(tài)庫, 中間因為報錯, 放棄
- 將Adyen直接打包成.a靜態(tài)庫, 問題依舊
- 那幾個符號是Google的Webp的, 于是私自鏈接Webp靜態(tài)庫到項目, 問題依舊
- 最后全局搜索了Webp, 在.xcconfig中發(fā)現(xiàn)了這個
是YYKit中依賴了Webp.framwork
猜測是不是這個和cocos2d.a中的符號產(chǎn)生了沖突, 最終證明是對的, 改為單獨集成YY中的組件, 未知符號的報錯終于消失??
問題2.swift 靜態(tài)庫NSClassFromString為nil?
Adyen支付流程異常, 支付也一直失敗, ??看來Adyen這源碼寫得不支持swift靜態(tài)庫啊
經(jīng)過斷點調(diào)試pluginClass為nil, 測試代碼也發(fā)現(xiàn)34行classB為nil, 原因也出在這
但是當(dāng)經(jīng)過32行初始化一個CardPlugin類之后, classB正常
有好幾種情況會導(dǎo)致這樣
- swift中需要NSClassFromString(moduleName + "." + "ClassName")使用
- Other Linker Flags 添加 ''-ObjC"
- .m沒有參與編譯(Compile Sources 添加即可) .m中忘記寫@implementation
而我的項目中Other Linker Flags這個是必加選項(經(jīng)驗, 經(jīng)驗), 也由此受到啟發(fā), 決定添加-force_load一試
-force_load ${PODS_CONFIGURATION_BUILD_DIR}/Adyen/libAdyen.a
??搞定!!!
問題疑惑(有大佬幫解答寫咩)
2個問題說是解決了, 但是本質(zhì)的原因還是沒搞明白
為什么同時鏈接webp.framework靜態(tài)庫和cocos2d.a會有沖突, 導(dǎo)致coco2d中的幾個符號找不到
-
為什么.xcconfig中鏈接了adyen, 還是需要進行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.
翻譯如下:
引用:
不過在64位的Mac系統(tǒng)或者iOS系統(tǒng)下厘唾,鏈接器有一個bug涩嚣,會導(dǎo)致只包含有類別的靜態(tài)庫無法使用-ObjC標(biāo)志來加載文件。變通方法是使用-all_load 或者-force_load標(biāo)志旧乞,它們的作用都是加載靜態(tài)庫中所有文件,不過all_load作用于所有的庫拭卿,而-force_load后面必須要指定具體的文件杖狼。
解釋:
這個flag是專門處理-ObjC的一個bug的。用了-ObjC以后颈畸,如果類庫中只有category分類但是沒有類的時候,這些category分類還是加載不進來。
變通方法就是加入-all_load或者-force-load没讲。
但根據(jù)CardPlugin的定義, 也不像是上面的那種情況