链接错误
Undefined symbols
只声明了符号,却未定义符号的具体实现。
分两种情况
1、符号没有具体实现。
2、符号有具体实现,但是链接器并不知道具体实现在哪。
对于第1种情况,需要实现符号定义。
对于第2种情况,我们只有配置好链接就好了。
常见的链接错误情况
libc++
错误形式如下:
Undefined symbols for architecture x86_64:
"vtable for __cxxabiv1::__class_type_info", referenced from:
typeinfo for FireflyTLV::TLVEntity in FireflyCrypto(TLVPackage.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"std::__1::__shared_weak_count::~__shared_weak_count()", referenced from:
std::__1::__shared_ptr_pointer<FireflyTLV::TLVEntity*, std::__1::default_delete<FireflyTLV::TLVEntity>, std::__1::allocator<FireflyTLV::TLVEntity> >::~__shared_ptr_pointer() in FireflyCrypto(TLVPackage.o)
std::__1::__shared_ptr_pointer<FireflyTLV::TLVEntity*, std::__1::default_delete<FireflyTLV::TLVEntity>, std::__1::allocator<FireflyTLV::TLVEntity> >::~__shared_ptr_pointer() in FireflyCrypto(TLVPackage.o)
"_inflate", referenced from:
_unzReadCurrentFile in Minizip(unzip.o)
libz 和 libz2
错误形式如下:
Undefined symbols for architecture x86_64:
"_inflate", referenced from:
_unzReadCurrentFile in Minizip(unzip.o)
"_inflateInit2_", referenced from:
_unzOpenCurrentFile3 in Minizip(unzip.o)
"_get_crc_table", referenced from:
_unzOpenCurrentFile3 in Minizip(unzip.o)
_zipOpenNewFileInZip3 in Minizip(zip.o)
"_inflateEnd", referenced from:
_unzCloseCurrentFile in Minizip(unzip.o)
"_BZ2_bzReadOpen", referenced from:
_ff_bs43patch in FireflyUtil(bsdiff43.o)
"_BZ2_bzRead", referenced from:
_ff_bs43patch in FireflyUtil(bsdiff43.o)
libsqlite3
错误形式如下:
Undefined symbols for architecture x86_64:
"_sqlite3_column_bytes", referenced from:
-[FMResultSet dataForColumnIndex:] in FMDB(FMResultSet.o)
-[FMResultSet dataNoCopyForColumnIndex:] in FMDB(FMResultSet.o)
"_sqlite3_column_double", referenced from:
-[FMResultSet doubleForColumnIndex:] in FMDB(FMResultSet.o)
"_sqlite3_column_int", referenced from:
-[FMResultSet intForColumnIndex:] in FMDB(FMResultSet.o)
"_sqlite3_column_text", referenced from:
-[FMResultSet kvcMagic:] in FMDB(FMResultSet.o)
-[FMResultSet stringForColumnIndex:] in FMDB(FMResultSet.o)
-[FMResultSet UTF8StringForColumnIndex:] in FMDB(FMResultSet.o)
"_sqlite3_column_name", referenced from:
-[FMResultSet columnNameToIndexMap] in FMDB(FMResultSet.o)
-[FMResultSet kvcMagic:] in FMDB(FMResultSet.o)
-[FMResultSet resultDictionary] in FMDB(FMResultSet.o)
-[FMResultSet columnNameForIndex:] in FMDB(FMResultSet.o)
"_sqlite3_column_count", referenced from:
-[FMResultSet columnCount] in FMDB(FMResultSet.o)
-[FMResultSet columnNameToIndexMap] in FMDB(FMResultSet.o)
-[FMResultSet kvcMagic:] in FMDB(FMResultSet.o)
-[FMResultSet resultDictionary] in FMDB(FMResultSet.o)
-[FMResultSet stringForColumnIndex:] in FMDB(FMResultSet.o)
-[FMResultSet dateForColumnIndex:] in FMDB(FMResultSet.o)
-[FMResultSet dataForColumnIndex:] in FMDB(FMResultSet.o)
...
"_sqlite3_result_error_code", referenced from:
-[FMDatabase resultErrorCode:context:] in FMDB(FMDatabase.o)
"_sqlite3_result_error", referenced from:
-[FMDatabase resultError:context:] in FMDB(FMDatabase.o)
"_sqlite3_result_text", referenced from:
-[FMDatabase resultString:context:] in FMDB(FMDatabase.o)
"_sqlite3_value_blob", referenced from:
-[FMDatabase valueData:] in FMDB(FMDatabase.o)
"_sqlite3_result_blob", referenced from:
-[FMDatabase resultData:context:] in FMDB(FMDatabase.o)
"_sqlite3_value_bytes", referenced from:
AssetsLibrary.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_ALAssetsLibrary", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerTool.o)
AVFoundation.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_AVAssetImageGenerator", referenced from:
objc-class-ref in FireflyUI(FireflySimpleCamera.o)
"_OBJC_CLASS_$_AVURLAsset", referenced from:
objc-class-ref in FireflyUI(FireflySimpleCamera.o)
Photos.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_PHAssetCollectionChangeRequest", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerManager.o)
"_OBJC_CLASS_$_PHImageManager", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerManager.o)
"_OBJC_CLASS_$_PHAsset", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerManager.o)
"_OBJC_CLASS_$_PHAssetCollection", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerManager.o)
"_OBJC_CLASS_$_PHFetchOptions", referenced from:
objc-class-ref in FireflyUI(FireflyImagePickerManager.o)
CoreMedia.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_CMSampleBufferGetImageBuffer", referenced from:
+[FireflyQRCodeScan imageFromSampleBuffer:] in FireflyScanCode(FireflyQRCodeScan.o)
WebKit.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_WKUserScript", referenced from:
objc-class-ref in FireflyJSBridge(FireflyWKWebView.o)
"_OBJC_CLASS_$_WKPreferences", referenced from:
objc-class-ref in FireflyJSBridge(FireflyJSWKWebViewController.o)
AddressBook.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_ABPersonCreate", referenced from:
___65+[FireflyJSBridgePhoneContact addPhoneContact:completionHandler:]_block_invoke in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_ABAddressBookCopyArrayOfAllPeople", referenced from:
___65+[FireflyJSBridgePhoneContact addPhoneContact:completionHandler:]_block_invoke in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_ABAddressBookRemoveRecord", referenced from:
___65+[FireflyJSBridgePhoneContact addPhoneContact:completionHandler:]_block_invoke in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonLastNameProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonFirstNameProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
___65+[FireflyJSBridgePhoneContact addPhoneContact:completionHandler:]_block_invoke in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_ABPersonSetImageData", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonNicknameProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonMiddleNameProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABWorkLabel", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonEmailProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonOrganizationProperty", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_ABRecordCopyValue", referenced from:
___65+[FireflyJSBridgePhoneContact addPhoneContact:completionHandler:]_block_invoke in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonAddressStateKey", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_kABPersonHomePageLabel", referenced from:
+[FireflyJSBridgePhoneContact parse:toContactPerson:] in FireflyJSBridge(FireflyJSBridgePhoneContact.o)
"_CNCopyCurrentNetworkInfo", referenced from:
+[FireflyNetworkReachInfo getWifiName] in FireflyNetwork(FireflyNetworkReachInfo.o)
CoreLocation.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_CLLocationManager", referenced from:
objc-class-ref in FireflyUtil(FireflyLocationManager.o)
"_kCLLocationAccuracyBest", referenced from:
-[FireflyLocationManager startLocation] in FireflyUtil(FireflyLocationManager.o)
"_CLLocationCoordinate2DMake", referenced from:
_S_FireflyLocationManager_GetCurrentCoordinate in FireflyUtil(FireflyLocationManager.o)
SystemConfiguration.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_CNCopySupportedInterfaces", referenced from:
+[FireflyNetworkReachInfo getWifiName] in FireflyNetwork(FireflyNetworkReachInfo.o)
"_SCNetworkReachabilitySetDispatchQueue", referenced from:
-[firelfy_Reachability_ startNotifier] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ stopNotifier] in FireflyNetwork(firelfy_Reachability_.o)
"_kCNNetworkInfoKeySSID", referenced from:
+[FireflyNetworkReachInfo getWifiName] in FireflyNetwork(FireflyNetworkReachInfo.o)
"_CNCopyCurrentNetworkInfo", referenced from:
+[FireflyNetworkReachInfo getWifiName] in FireflyNetwork(FireflyNetworkReachInfo.o)
"_CTRadioAccessTechnologyLTE", referenced from:
+[FireflyNetworkReachInfo getNetWorkType] in FireflyNetwork(FireflyNetworkReachInfo.o)
"_SCNetworkReachabilityGetFlags", referenced from:
___47-[AFNetworkReachabilityManager startMonitoring]_block_invoke.52 in AFNetworking(AFNetworkReachabilityManager.o)
+[FireflyNetworkReachInfo getNetWorkType] in FireflyNetwork(FireflyNetworkReachInfo.o)
-[firelfy_Reachability_ isReachable] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ isReachableViaWWAN] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ isReachableViaWiFi] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ connectionRequired] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ isConnectionOnDemand] in FireflyNetwork(firelfy_Reachability_.o)
...
"_CTRadioAccessTechnologyGPRS", referenced from:
+[FireflyNetworkReachInfo getNetWorkType] in FireflyNetwork(FireflyNetworkReachInfo.o)
"_SCNetworkReachabilitySetCallback", referenced from:
-[AFNetworkReachabilityManager startMonitoring] in AFNetworking(AFNetworkReachabilityManager.o)
-[firelfy_Reachability_ startNotifier] in FireflyNetwork(firelfy_Reachability_.o)
-[firelfy_Reachability_ stopNotifier] in FireflyNetwork(firelfy_Reachability_.o)
"_SCNetworkReachabilityCreateWithAddress", referenced from:
+[AFNetworkReachabilityManager managerForAddress:] in AFNetworking(AFNetworkReachabilityManager.o)
+[FireflyNetworkReachInfo getNetWorkType] in FireflyNetwork(FireflyNetworkReachInfo.o)
+[firelfy_Reachability_ reachabilityWithAddress:] in FireflyNetwork(firelfy_Reachability_.o)
"_SCNetworkReachabilityCreateWithName", referenced from:
+[AFNetworkReachabilityManager managerForDomain:] in AFNetworking(AFNetworkReachabilityManager.o)
+[firelfy_Reachability_ reachabilityWithHostname:] in FireflyNetwork(firelfy_Reachability_.o)
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in FireflyNetwork(FireflyNetworkReachInfo.o)
objc-class-ref in FireflyStatistics(UMSCommonMethod.o)
"_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
-[AFNetworkReachabilityManager stopMonitoring] in AFNetworking(AFNetworkReachabilityManager.o)
"_OBJC_CLASS_$_QLPreviewController", referenced from:
_OBJC_CLASS_$_FireflyDocPreviewController in FireflyDocPreview(FireflyDocPreviewController.o)
"_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
-[AFNetworkReachabilityManager startMonitoring] in AFNetworking(AFNetworkReachabilityManager.o)
AdSupport.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_ASIdentifierManager", referenced from:
objc-class-ref in FireflyUtil(FireflySystemInfo.o)
CoreTelephony.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_CTRadioAccessTechnologyEdge", referenced from:
+[FireflyNetworkReachInfo getNetWorkType] in FireflyNetwork(FireflyNetworkReachInfo.o)
QuickLook.framework
错误形式如下:
Undefined symbols for architecture x86_64:
"_OBJC_METACLASS_$_QLPreviewController", referenced from:
_OBJC_METACLASS_$_FireflyDocPreviewController in FireflyDocPreview(FireflyDocPreviewController.o)
运行错误
unrecognized selector sent to instance
通常,实例instance没有响应selector,也可以说实例instance没有实现方法selector。 其错误栈信息形式如下:
2019-06-25 18:53:33.692863+0800 FFDemo[50209:1541645] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImageView setFf_size:]: unrecognized selector sent to instance 0x7fcf7b605ab0'
*** First throw call stack:
(
0 CoreFoundation 0x00000001076d36fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000106c77ac5 objc_exception_throw + 48
2 CoreFoundation 0x00000001076f1ab4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 UIKitCore 0x000000010c0e6c3d -[UIResponder doesNotRecognizeSelector:] + 287
4 CoreFoundation 0x00000001076d8443 ___forwarding___ + 1443
5 CoreFoundation 0x00000001076da238 _CF_forwarding_prep_0 + 120
6 FFDemo 0x000000010637f6e6 -[FireflyDemoMainViewController setupView] + 181
7 FFDemo 0x000000010637f4c5 -[FireflyDemoMainViewController viewDidLoad] + 37
8 FFDemo 0x000000010637d4e3 -[FFDemoMainViewController viewDidLoad] + 51
9 UIKitCore 0x000000010bab843b -[UIViewController loadViewIfRequired] + 1183
10 UIKitCore 0x000000010ba1c004 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
11 UIKitCore 0x000000010ba1c2f7 -[UINavigationController _startTransition:fromViewController:toViewController:] + 146
12 UIKitCore 0x000000010ba1d3b5 -[UINavigationController _startDeferredTransitionIfNeeded:] + 896
13 UIKitCore 0x000000010ba1e6a7 -[UINavigationController __viewWillLayoutSubviews] + 150
14 UIKitCore 0x000000010b9ff38d -[UILayoutContainerView layoutSubviews] + 217
15 UIKitCore 0x000000010c5889c1 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1417
16 QuartzCore 0x000000010daf9eae -[CALayer layoutSublayers] + 173
17 QuartzCore 0x000000010dafeb88 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 396
18 QuartzCore 0x000000010db0aee4 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 72
19 QuartzCore 0x000000010da7a3aa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 328
20 QuartzCore 0x000000010dab1584 _ZN2CA11Transaction6commitEv + 608
21 UIKitCore 0x000000010c0d3ccb __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 128
22 CoreFoundation 0x000000010763aaec __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
23 CoreFoundation 0x000000010763a2b0 __CFRunLoopDoBlocks + 336
24 CoreFoundation 0x0000000107634b34 __CFRunLoopRun + 1252
25 CoreFoundation 0x0000000107634302 CFRunLoopRunSpecific + 626
26 GraphicsServices 0x000000010fcbf2fe GSEventRunModal + 65
27 UIKitCore 0x000000010c0baba2 UIApplicationMain + 140
28 FFDemo 0x000000010637cde0 main + 112
29 libdyld.dylib 0x00000001097a0541 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
引起这个崩溃的常见情况有两个:
1、在代码中以Catagory
的形式实现了对应方法,编译打包都没有问题,但是运行是没有加载Catagory
方法的符号,导致崩溃。
这种情况,需要在Build Settings -> Linking -> Other Link Flags
添加-ObjC
2、确实没有实现对应的方法。
这种情况,需要实现对应方法。