今天在引入一個第三方的拍照選擇照片的庫時,編譯報錯。
Undefined symbolsforarchitecture x86_64:"_ALAssetPropertyAssetURL", referenced from:? ? ? -[TZImageManager getAssetIdentifier:]inTZImageManager.o"_ALAssetPropertyDuration", referenced from:? ? ? ___90-[TZImageManager getAssetsFromFetchResult:allowPickingVideo:allowPickingImage:completion:]_block_invoke139inTZImageManager.o? ? ? ___97-[TZImageManager getAssetFromFetchResult:atIndex:allowPickingVideo:allowPickingImage:completion:]_block_invokeinTZImageManager.o"_ALAssetPropertyType", referenced from:? ? ? ___90-[TZImageManager getAssetsFromFetchResult:allowPickingVideo:allowPickingImage:completion:]_block_invoke139inTZImageManager.o? ? ? ___97-[TZImageManager getAssetFromFetchResult:atIndex:allowPickingVideo:allowPickingImage:completion:]_block_invokeinTZImageManager.o"_ALAssetPropertyURLs", referenced from:? ? ? -[TZImageManager getVideoWithAsset:completion:]inTZImageManager.o? ? ? -[TZImageManager isAssetsArray:containAsset:]inTZImageManager.o"_ALAssetTypeVideo", referenced from:? ? ? ___90-[TZImageManager getAssetsFromFetchResult:allowPickingVideo:allowPickingImage:completion:]_block_invoke139inTZImageManager.o? ? ? ___97-[TZImageManager getAssetFromFetchResult:atIndex:allowPickingVideo:allowPickingImage:completion:]_block_invokeinTZImageManager.o"_ALAssetsGroupPropertyName", referenced from:? ? ? ___66-[TZImageManager getCameraRollAlbum:allowPickingImage:completion:]_block_invokeinTZImageManager.o? ? ? ___60-[TZImageManager getAllAlbums:allowPickingImage:completion:]_block_invokeinTZImageManager.o"_OBJC_CLASS_$_ALAsset", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_ALAssetsFilter", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_ALAssetsGroup", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_ALAssetsLibrary", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAsset", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetCollection", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetCreationRequest", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetResourceCreationOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHCachingImageManager", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHFetchOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHFetchResult", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHImageManager", referenced from:? ? ? objc-class-refinTZAssetCell.o? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHImageRequestOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHPhotoLibrary", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHVideoRequestOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_PHImageCancelledKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___55-[TZImageManager getOriginalPhotoWithAsset:completion:]_block_invokeinTZImageManager.o"_PHImageErrorKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___55-[TZImageManager getOriginalPhotoWithAsset:completion:]_block_invokeinTZImageManager.o"_PHImageManagerMaximumSize", referenced from:? ? ? -[TZImageManager getOriginalPhotoWithAsset:completion:]inTZImageManager.o"_PHImageResultIsDegradedKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invoke_2inTZImageManager.o"_PHImageResultIsInCloudKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.old: symbol(s) not foundforarchitecture x86_64clang: error: linkercommandfailed withexitcode1(use -v to see invocation)
經過幾個小時的查資料,和嘗試,基本上確定了是由于部分依賴的框架沒有導入(天知道為什么會沒有導入,我在另一個項目里面直接拖進去就可以編譯的,坑爹的xcode)。
于是我仔細看了下報錯的內容,都是指向TZImageManager,于是我到對應的.m文件里面,發現它引用了系統的AssetsLibrary框架:
屏幕快照 2016-07-01 16.41.07.png
我嘗試手動導入這個框架:
屏幕快照 2016-07-01 16.45.05.png
編譯一下,原來報27個錯,現在只有17個了,看來有效果。于是我繼續找還缺少了什么框架。現在的報錯如下:
Undefined symbolsforarchitecture x86_64:"_OBJC_CLASS_$_PHAsset", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetCollection", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetCreationRequest", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHAssetResourceCreationOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHCachingImageManager", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHFetchOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHFetchResult", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHImageManager", referenced from:? ? ? objc-class-refinTZAssetCell.o? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHImageRequestOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHPhotoLibrary", referenced from:? ? ? objc-class-refinTZImageManager.o"_OBJC_CLASS_$_PHVideoRequestOptions", referenced from:? ? ? objc-class-refinTZImageManager.o"_PHImageCancelledKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___55-[TZImageManager getOriginalPhotoWithAsset:completion:]_block_invokeinTZImageManager.o"_PHImageErrorKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___55-[TZImageManager getOriginalPhotoWithAsset:completion:]_block_invokeinTZImageManager.o"_PHImageManagerMaximumSize", referenced from:? ? ? -[TZImageManager getOriginalPhotoWithAsset:completion:]inTZImageManager.o"_PHImageResultIsDegradedKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.o? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invoke_2inTZImageManager.o"_PHImageResultIsInCloudKey", referenced from:? ? ? ___58-[TZImageManager getPhotoWithAsset:photoWidth:completion:]_block_invokeinTZImageManager.old: symbol(s) not foundforarchitecture x86_64clang: error: linkercommandfailed withexitcode1(use -v to see invocation)
當時在看這個報錯的時候,一頭霧水,PHxxx的庫根本找不到,于是在.m里面找,半天之后猜是不是Photos框架,導入了之后編譯成功!
猜得很艱辛啊。
現在寫這個文章的時候,突然發現對應的TZImageManager.h文件里果然導入了Photos框架……
屏幕快照 2016-07-01 16.53.18.png
猜得那么辛苦,原來.h里面就有答案,醉了。
解決這個問題花了一個下午的時間,寫一篇文章做個備份,免得下次又被坑。
文/Javen_01(簡書作者)
原文鏈接:http://www.lxweimin.com/p/d91f270f3763
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。