【发布时间】:2015-10-04 04:46:59
【问题描述】:
我一直在使用 Unity 4.6.6 构建我的 Xcode 项目,但我在使用 IL2CPP 时遇到了问题。我在构建时在 Player 设置中选择通用架构(包括 armv7 和 arm64),在它生成的 Xcode 项目中,在构建时遇到以下 Mach-O 链接器错误。
架构 armv7 的未定义符号: “_sqlite3_bind_int”,引用自: -[SmacBaseDao setSqlBindStatement:entity:colmunInfoList:emptyIsNull:] 在 libSmacTracking.a(SmacBaseDao.o) “_sqlite3_errmsg”,引用自: -[SmacBaseDao execSelectQuery:condition:colmun:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execInsertQuery:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execUpdateQuery:condition:emptyIsNull:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getColmunsInfo:transactionDbObj:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getTableList] 在 libSmacTracking.a(SmacBaseDao.o) “_sqlite3_column_int”,引用自: -[SmacBaseDao getNumber:column:] 在 libSmacTracking.a(SmacBaseDao.o) “_sqlite3_open”,引用自: -[SmacBaseDao dbOpen] 在 libSmacTracking.a(SmacBaseDao.o) “_sqlite3_exec”,引用自: -[SmacBaseDao dbOpen] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao dbClose:] 在 libSmacTracking.a(SmacBaseDao.o) “_OBJC_CLASS_$_NSManagedObjectModel”,引用自: libGoogleAnalyticsServices.a(GAICoreDataUtil.o) 中的 objc-class-ref “_sqlite3_prepare_v2”,引用自: -[SmacUpdate updateDB] 在 libSmacTracking.a(SmacUpdate.o) -[SmacBaseDao dbOpen] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execSelectQuery:condition:colmun:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execInsertQuery:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execUpdateQuery:condition:emptyIsNull:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getColmunsInfo:transactionDbObj:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getTableList] 在 libSmacTracking.a(SmacBaseDao.o) ... “_sqlite3_step”,引用自: -[SmacUpdate updateDB] 在 libSmacTracking.a(SmacUpdate.o) -[SmacBaseDao dbOpen] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execSelectQuery:condition:colmun:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execInsertQuery:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execUpdateQuery:condition:emptyIsNull:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getColmunsInfo:transactionDbObj:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getTableList] 在 libSmacTracking.a(SmacBaseDao.o) ... “_sqlite3_column_text”,引用自: -[SmacBaseDao getString:column:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getDateString:column:] 在 libSmacTracking.a(SmacBaseDao.o) “_sqlite3_finalize”,引用自: -[SmacUpdate updateDB] 在 libSmacTracking.a(SmacUpdate.o) -[SmacBaseDao dbOpen] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execSelectQuery:condition:colmun:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execInsertQuery:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execUpdateQuery:condition:emptyIsNull:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao getColmunsInfo:transactionDbObj:] 在 libSmacTracking.a(SmacBaseDao.o) “_OBJC_CLASS_$_NSEntityDescription”,引用自: libGoogleAnalyticsServices.a(GAIDataStore.o) 中的 objc-class-ref libGoogleAnalyticsServices.a(GAICoreDataUtil.o) 中的 objc-class-ref “_OBJC_CLASS_$_NSManagedObjectContext”,引用自: libGoogleAnalyticsServices.a(GAIDataStore.o) 中的 objc-class-ref “_OBJC_CLASS_$_NSPersistentStoreCoordinator”,引用自: libGoogleAnalyticsServices.a(GAIDataStore.o) 中的 objc-class-ref “_kSecReturnData”,引用自: -[KeychainItemWrapper secItemFormatToDictionary:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_kSecMatchLimitOne”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o “_kSecMatchLimit”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o “_OBJC_CLASS_$_NSFetchRequest”,引用自: libGoogleAnalyticsServices.a(GAIDataStore.o) 中的 objc-class-ref “_NSOverwriteMergePolicy”,引用自: - [GAIDataStore contextWithModel:URL:] 在 libGoogleAnalyticsServices.a(GAIDataStore.o) “_sqlite3_reset”,引用自: -[SmacBaseDao execInsertQuery:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) -[SmacBaseDao execUpdateQuery:condition:emptyIsNull:transactionDbObj:isTmp:] 在 libSmacTracking.a(SmacBaseDao.o) “_kSecClassGenericPassword”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o -[KeychainItemWrapper dictionaryToSecItemFormat:] 在 KeychainItemWrapper.o -[KeychainItemWrapper secItemFormatToDictionary:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_OBJC_CLASS_$_NSAttributeDescription”,引用自: libGoogleAnalyticsServices.a(GAICoreDataUtil.o) 中的 objc-class-ref “_kSecAttrService”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_kSecAttrLabel”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper resetKeychainItem] +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o “_NSSQLiteStoreType”,引用自: - [GAIDataStore coordinatorWithModel:URL:] 在 libGoogleAnalyticsServices.a(GAIDataStore.o) “_NSSQLiteErrorDomain”,引用自: -[GAIDataStore performBlockAndWait:withError:] 在 libGoogleAnalyticsServices.a(GAIDataStore.o) “_sqlite3_bind_null”,引用自: -[SmacBaseDao setSqlBindStatement:entity:colmunInfoList:emptyIsNull:] 在 libSmacTracking.a(SmacBaseDao.o) “_kSecClass”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o -[KeychainItemWrapper dictionaryToSecItemFormat:] 在 KeychainItemWrapper.o -[KeychainItemWrapper secItemFormatToDictionary:] 在 KeychainItemWrapper.o -KeychainItemWrapper.o 中的[KeychainItemWrapper writeToKeychain] +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o ... “_kSecAttrGeneric”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o “_kSecAttrAccount”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_kSecValueData”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper resetKeychainItem] -[KeychainItemWrapper dictionaryToSecItemFormat:] 在 KeychainItemWrapper.o -[KeychainItemWrapper secItemFormatToDictionary:] 在 KeychainItemWrapper.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o “_kSecAttrAccessGroup”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_SecItemUpdate”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper writeToKeychain] +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o “_OBJC_CLASS_$_SKProductsRequest”,引用自: AppStoreProcess.o 中的 objc-class-ref “_sqlite3_bind_text”,引用自: -[SmacBaseDao setSqlBindStatement:entity:colmunInfoList:emptyIsNull:] 在 libSmacTracking.a(SmacBaseDao.o) “_SecItemCopyMatching”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o -[KeychainItemWrapper secItemFormatToDictionary:] 在 KeychainItemWrapper.o -KeychainItemWrapper.o 中的[KeychainItemWrapper writeToKeychain] +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_sqlite3_close”,引用自: -[SmacBaseDao dbClose:] 在 libSmacTracking.a(SmacBaseDao.o) “_SecItemAdd”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper writeToKeychain] +[KeychainUtils setValue:key:servicename:accessGroup:force:errorDomain:error:] 在 KeychainUtils.o “_SecItemDelete”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper resetKeychainItem] +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_OBJC_CLASS_$_SKPayment”,引用自: AppStoreProcess.o 中的 objc-class-ref “_kSecReturnAttributes”,引用自: -[KeychainItemWrapper initWithIdentifier:serviceName:accessGroup:] 在 KeychainItemWrapper.o +[KeychainUtils getStoredValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o +[KeychainUtils deleteValue:serviceName:accessGroup:errorDomain:error:] 在 KeychainUtils.o “_kSecAttrDescription”,引用自: -KeychainItemWrapper.o 中的[KeychainItemWrapper resetKeychainItem] “_OBJC_CLASS_$_SKPaymentQueue”,引用自: AppStoreProcess.o 中的 objc-class-ref ld:未找到架构 armv7 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
我已经阅读了一些关于“架构 armv7 的未定义符号”的问题,例如 this one,但最佳答案中建议的解决方案并不真正适用,因为在我的情况下,Unity 将所需的文件放入 Xcode项目文件夹。此外,在检查错误查找的库后,它们已正确添加到构建阶段的 Link Binary With Libraries 部分中。
如果我做错了什么,谁能帮助或启发我?
我还尝试在 Unity Player 设置中选择仅 armv7 或仅 arm64 以使用 IL2CPP 构建,但我仍然在 Xcode 中分别收到“armv7 未定义符号”或“arm64 未定义符号”Mach-O 链接器错误。
使用的软件: Unity 4.6.6、Xcode 6.1(将尝试升级到 6.3)和 iOS 8.1 基础 SDK
【问题讨论】:
标签: ios xcode unity3d arm64 il2cpp