xcode调试之-Undefined symbols for a
一、背景简介
出现以上这个问题,一般都是我们在导入第三方框架的时候容易出现的问题,还有一个是i386框架问题,具体框架是干嘛用的可以具体参见iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么
具体截图如下:
出现此问题分两种情况:
1>第一种是第三方的,但是第三方的一般是有真机的和模拟器的静态库都有的,所以这个基本上不用担心,重要的是第三方SDK有很多的系统依赖库,可能是系统依赖库没有导入或者导全。
2>第二种就是我们自制的静态库,可能只编译了真机的静态库,导入之后然后运行的时候用的模拟器来运行,就会报这样的错误了,或者只编译了模拟器的静态库,但是用真机运行也会报类似的错误。
二、问题解决
1、针对于第二种这种编译SDK的问题,有一个关于合并这两种架构体系下的静态库问题, iOS 制作自己的FrameWork遇到的一些问题 以及FrameWork通过包合并支持arm64 armv7 i386 架构
2、针对于第一种第三方框架的系统依赖库未导入或者未导入完全导致的错误,有以下的对照表,可以让大家参照去导入,对照表如下:
framework名 | 报错 |
---|---|
GLKit.framework | OBJC_CLASS$_GLKView |
* | _GLKMatrix4Identity |
MobileCoreServices.framework | _kUTTagClassMIMEType |
* | _UTTypeCreatePreferredIdentifierForTag |
CoreVideo.framework | _CVOpenGLESTextureCacheCreateTextureFromImage |
* | _CVOpenGLESTextureGetName |
* | _CVOpenGLESTextureCacheCreate |
* | _CVOpenGLESTextureCacheFlush |
* | _CVPixelBufferGetWidth |
* | _CVOpenGLESTextureGetTarget |
* | _kCVPixelBufferPixelFormatTypeKey |
* | _kCVImageBufferYCbCrMatrix_ITU_R_601_4 |
* | _CVPixelBufferGetHeight |
* | _CVBufferGetAttachment |
* | _kCVImageBufferYCbCrMatrixKey |
StoreKit.framework | OBJC_CLASS$_SKProductsRequest |
* | OBJC_CLASS$_SKMutablePayment |
* | OBJC_CLASS$_SKPaymentQueue |
* | OBJC_CLASS$_SKStoreProductViewController |
* | _SKStoreProductParameterITunesItemIdentifier |
MediaPlayer.framework | _MPMoviePlayerPlaybackDidFinishNotification |
* | _MPMoviePlayerPlaybackStateDidChangeNotification |
* | OBJC_CLASS$_MPMoviePlayerController |
* | OBJC_CLASS$_MPVolumeView |
SafariServices.framework | OBJC_CLASS$_SFSafariViewController |
AdSupport.framework | OBJC_CLASS$_ASIdentifierManager |
CoreMotion.framework | OBJC_CLASS$_CMMotionManager |
CoreTelephony.framework | _CTRadioAccessTechnologyDidChangeNotification |
* | OBJC_CLASS$_CTTelephonyNetworkInfo |
MessageUI.framework | OBJC_CLASS$_MFMailComposeViewController |
* | OBJC_CLASS$_MFMessageComposeViewController |
CoreText.framework | _CTFramesetterCreateWithAttributedString |
* | _CTFramesetterSuggestFrameSizeWithConstraints |
GameKit.framework | OBJC_CLASS$_GKAchievement |
* | OBJC_CLASS$_GKScore |
* | OBJC_CLASS$_GKGameCenterViewController |
* | OBJC_CLASS$_GKLocalPlayer |
GameController.framework | _GCControllerDidConnectNotification |
* | _GCControllerDidDisconnectNotification |
SystemConfiguration.framework | _SCNetworkReachabilityCreateWithAddress |
* | _SCNetworkReachabilityGetFlags |
* | _SCNetworkReachabilityCreateWithName |
* | _SCNetworkReachabilitySetDispatchQueue |
* | _SCNetworkReachabilitySetCallback |
Security.framework | _SecCertificateCreateWithData |
* | _SecTrustCopyExceptions |
* | _SecTrustEvaluate |
* | _SecTrustSetAnchorCertificates |
* | _SecTrustSetExceptions |
CoreMedia.framework | _CMTimeGetSeconds |
* | _CMTimeMakeWithSeconds |
* | _CMTimeMake |
* | _kCMTimeZero |
OpenGLES.framework | OBJC_CLASS$_EAGLContext |
* | _glActiveTexture |
CFNetwork.framework | _CFHostCreateWithName |
* | _CFHostStartInfoResolution |
* | _CFHostGetAddressing |
CoreData.framework | _NSManagedObjectModel |
* | _NSAttributeDescription |
* | _NSEntityDescription |
* | _NSPersistentStoreCoordinator |
* | _NSFetchRequest |
* | _NSManagedObjectContext |
* | _NSSQLiteErrorDomain |
* | _NSSQLiteStoreType |
* | _NSOverwriteMergePolicy |
ReplayKit | OBJC_CLASS$_RPScreenRecorder |
* | OBJC_CLASS$_RPBroadcastActivityViewController |
MapKit.framwork | OBJC_CLASS$_MKMapItem |
* | _MKLaunchOptionsDirectionsModeKey |
* | OBJC_CLASS$_MKPlacemark |
* | _MKLaunchOptionsDirectionsModeDriving |
* | _MKLaunchOptionsShowsTraffickey |
系统动态库 | 关联的报错引用 |
libz.tbd/libz.dylib | _inflate |
* | deflateInit2 |
* | _deflateEnd |
* | _inflateInit2 |
* | _deflate |
* | _get_crc_table |
* | _inflate |
* | _inflateEnd |
libsqlite3.tbd | _sqlite3_step |
* | _sqlite3_free |
* | _sqlite3_column_int |
* | _sqlite3_column_int64 |
* | _sqlite3_column_text |
* | _sqlite3_exec |
* | _sqlite3_finalize |
* | _sqlite3_close |
* | _sqlite3_open |
* | _sqlite3_prepare_v2 |
libstdc++.tbd | ___gxx_personality_v0 |
扩展一:
如果在编译链接的过程中出现如下报错:
"OBJC_CLASS$_DOUMPMediaLibraryAssetLoader", referenced from:
那么解决办法如下:
在DOUMPMediaLibraryAssetLoader的.h和.m文件中的开头和结尾,注释掉或删除 #if TARGET_OS_IPHONE 和 #endif
扩展二:
如果我们在链接的时候报错了,只要不是动态库,看起来不像自定义的那种你就搜一下,比如出现如下的报错:
Snip20170817_126.png那这个我们上面没有收录到的话,那你就可以大概猜一下,根据关键字"CBUUID"还有CBCentralManager这俩的话,很容易猜到系统的Framework"CoreBlutooth.framework",蓝牙里面会用到UUID,所以很容易猜的不要惊慌,教大家一个方法:
首先你看到有一个C,那你现在Build Phrase里面敲一个C,然后再看
然后再看下面显示列表中的含有B的,发现好像也就CoreBlutooth合适了,所以导入看下就知道了。
寄语
希望大家看了我的简书之后自己以后遇到了类似的库缺失问题解决了的,能够来此补充下,没解决的可以评论交流,以上!!!
小七.jpg