接入支付寶報出一堆警告解決方法warning: (armv7) /Users/lijiajia/Documents/work/sourcecode/alipaysdk/ios/ha304_cp_record_client_release_556515_20151203_mspc_iphone_msdk/AlipaySDK4Standard/AlipaySDK/Library/UTDID.framework/UTDID(UTDIDMain.o) unable to open object file: No such file or directory
報出的警告如下圖
解決方法如下圖
最近在引入了一個 framework 后狸眼,在 Generate dSYM 的時候報出了大量的 warning:
warning:(armv7)/Users/USERNAME/Library/Developer/Xcode/DerivedData/FRAMEWORKNAME-gizpafzckwvhuigzyzdtbpcvryue/Build/Intermediates/FRAMEWORKNAME.build/Debug-iphoneos/FRAMEWORKNAME.build/Objects-normal/armv7/SOMECLASS.o unable to open objectfile:No such file or directory
在 Xcode 查看編譯過程發(fā)現(xiàn)是執(zhí)行dsymutil這條命令時產(chǎn)生的劈愚。
dsymutil links the DWARF debug information found in the object files for an executable exe_path by using debug symbols information contained in its symbol table.
眾所周知镜硕,Xcode 編譯的時候會處理兩種符號:
Mach-O 符號:鏈接器在鏈接的時候需要處理茂浮。
調(diào)試符號:顧名思義双谆,在使用調(diào)試器調(diào)試用到的符號。
為了讓發(fā)行的安裝包更小席揽,通常會在編譯的時候?qū)⒄{(diào)試符號從可執(zhí)行文件中去掉顽馋。這樣,在發(fā)生 crash 后得到的 crash log 里面只能得到 16 進制的地址幌羞。
Xcode 提供了一個編譯設(shè)置項:Debug Information Format寸谜,有兩個選項:DWARF和DWARF with dSYM File。
其中属桦,DWARF是一種獨立于語言和操作系統(tǒng)的調(diào)試文件格式熊痴。最初是設(shè)計用來配合 ELF( Executable and Linkable Format,精靈和矮人 :])工作的聂宾。DWARF 不會在可執(zhí)行文件中包含調(diào)試符號果善,而是僅僅包含對 .o 文件的引用,而這些 .o 文件才真正包含調(diào)試符號系谐。
dSYM 是 Xcode 用來存儲調(diào)試符號的文件巾陕,可以用它來符號化 crash log 或者調(diào)試程序。我們需要編譯過程中產(chǎn)生的 .o 或者 .dSYM 文件配合才可以調(diào)試纪他。
如果Debug Information Format設(shè)置成了DWARF with dSYM File鄙煤,Xcode 在編譯結(jié)束時會調(diào)用dsymutil,將 .o 中的符號抽出來生成 .dSYM 文件茶袒。
(生成 .dSYM 文件需要消耗一定的時間梯刚,因為 debug 的時候本地有 .o 文件,可以不需要 .dSYM 文件來 debug薪寓,所以最好將 debug 版本的Debug Information Format設(shè)置成DWARF亡资。)
回頭來看最初的問題。使用
nm -a/path/to/foo.framework/foo
來查看所有的符號预愤,其中就包含了
000000005704a7a2 -030001OSO/Users/USERNAME/Library/Developer/Xcode/DerivedData/VIVerifyCore-gfjrgtjfcqfqpybbcyouhfavymdn/Build/Intermediates/FRAMEWORKNAME.build/Debug-iphonesimulator/FRAMEWORKNAME.build/Objects-normal/armv7/SOMECLASS.o
由此可見沟于,因為引入的 framework 編譯時開啟了Generate Debug Symbols,編譯出來的二進制文件包含了對一些 .o 文件的引用植康。這些 .o 文件是 framework 在編譯的過程中產(chǎn)生的旷太,framework 的使用方在執(zhí)行dsymutil時找不到它們,于是產(chǎn)生 warning。
在關(guān)閉Generate Debug Symbols后重新編譯 framework供璧,執(zhí)行同樣的命令存崖,生成的可執(zhí)行文件中就沒有這些引用了。再集成到 App 中睡毒,編譯就不會有前面提到的 warning来惧。