Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法

本文总结了Undefined symbols for architecture错误的常见原因与解决方法,包括工程文件导入、.framework文件缺失、文件路径问题等,并提供了针对特定环境如Cocos2d-x项目的特殊解决方案。
原文地址为: Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法

多个人共同操作同一个项目或拷贝项目时,经常会出现类似这样的问题:

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_xx文件名", referenced from:




下面是可能导致这类问题出现的原因及修改:

1.相关工程文件未导入





你可以直接在这里+进来,也可以在左边工程目录中把文件全部重新导人一遍(多人操作工程时,一般这种解决办法)



2..framework文件未导入





把xx文件库+进来,本问题"_OBJC_CLASS_$_ASIdentifierManager", 就是因为AdSupport.Framework类库未加



3.文件路径缺失




检查是否某些文件路径未加入进来或者写错了


4.可能是找不到对应的编译包

把libc++库导入就解决了





工程编译报出:Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:错误,问题大致是由于上面这几种情况,把各个方面检查下基本就ok了。


---------------------------分割线-----------------------------------

ps1:

这里有个其他的情况及其处理方法:

Undefined symbols for architecture armv7:
"cocos2d::CCDictionary::removeObjectForKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
tolua_Cocos2d_CCDictionary_removeObjectForKey00(lua_State*) in liblua.a(LuaCocos2d.o)
tolua_Cocos2dx_ActionTimeline_clearFrameEventCallFunc00(lua_State*) in liblua.a(lua_cocos2dx_cocostudio_manual.o)
cocostudio::timeline::ActionTimelineCache::removeAction(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libextensions.a(CCActionTimelineCache.o)
cocos2d::extension::CCArmature::removeBone(cocos2d::extension::CCBone*, bool) in libextensions.a(CCArmature.o)
cocos2d::extension::CCArmatureDataManager::removeArmatureData(char const*) in libextensions.a(CCArmatureDataManager.o)
cocos2d::extension::CCArmatureDataManager::removeAnimationData(char const*) in libextensions.a(CCArmatureDataManager.o)
cocos2d::extension::CCArmatureDataManager::removeTextureData(char const*) in libextensions.a(CCArmatureDataManager.o)
...
"non-virtual thunk to cocos2d::CCTextFieldTTF::getContentText()", referenced from:
vtable for cocos2d::ui::UICCTextField in libextensions.a(UITextField.o)
"cocos2d::CCDictionary::valueForKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:

这个也是比较多出现的问题,找不到所要的符号。但是其实我的.a静态库是存在的,并且也包含了

解决方案:

1. 将游戏项目的 Deployment Target 改成7.0以下

2. 将cocos2dx重新编译一遍, Build Settings->Apple LLVM *.0 -Language -C++  按下面配置

 

其他cocosDenshion和extensions也按这个配置

然后该问题解决


---------------------------分割线-----------------------------------

ps2:

https://my.oschina.net/ioslighter/blog/363211?fromerr=vcwQiVOs

在这里做个总结吧

可能会遇到这几种错误:
Undefined symbols for architecture armv7
Undefined symbols for architecture armv7s
Undefined symbols for architecture arm64
Undefined symbols for architecture i386
Undefined symbols for architecture x86_64

错误原因分析
1、大部分情况下是忘记添加了某个系统framework或dylib吧,比如你在项目中使用了sqlite3,但是没有添加libsqlite3.dylib,就会出现这个问题。解决办法是增加对应的framework或dylib。
2、如果是在C++里调用C函数,检查是否有添加extern "C",这可以通过观察错误提示中的函数名形式来决定,如果是C函数而以C ++的方式调用就需要添加extern "C"。
3、如果是把其它工程的xcodeproj文件加入到当前项目中,检查Build Phases中的Target Dependencies有没有添加依赖,以及General中的Linked Frameworks and Libraries有没有添加相关的.a文件。
4、如果添加.a文件编译无错而添加xcodeproj文件编译出错可参考3
5、如果添加.a文件编译出错,首先检查其对应的头文件是否添加正确,或者在Build Setting中有没有添加对应的Header Search Path路径;其次检查.a文件的c++编译选项与当前项目的c++编译选项是否一致;最后检查.a文件与当前项目的CPU架构信息是否一致
6、如果是extern变量报这个错误,要检查extern变量有没有在其它地方声明,如果没有则加上;如果外部变量在静态库中,可根据5检查引用头文件或头文件搜索路径是否正确;如果头文件无问题,就需要检查静态库与与当前项目的CPU架构信息是否一致
7、如果是使用了静态库,真机Debug测试时正常,而在执行for iOS Device测试时报这个错误,很可能是因为静态库支持的架构不全。出现这种情况是Build Setting中的Build Active Architecture Only在Debug下设为Yes,从而使得真机Debug测试正常。

8、如果只有@interface,没有@implementation也会导致这个错误

检查静态库的CPU架构支持命令:
lipo -info xxxxx.a 

找出不支持arm64的静态库 
find . -name *.a -exec lipo -info "{}" \;

在@end处提示expected }错误解决
问题很明显是}匹配出现问题了。如果代码少很好找,如果代码很多怎么缩小查找范围呢?一般出现这个问题时伴随另一个错误:在某个函数定义处提示"Use of undeclared identifire 'someMethod'”,那么就是在此函数定义之前的地方少了一个},导致编译器误把函数定义当成函数调用了。


转载请注明本文地址: Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法
Undefined symbol: _APMAnalyticsConfiguration Undefined symbol: _APMAppMeasurementOriginFirebase Undefined symbol: _APMConsentSettings3P Undefined symbol: _APMFormattedEventName Undefined symbol: _APMFormattedUserPropertyName Undefined symbol: _APMIsAnalyticsCollectionDeactivated Undefined symbol: _APMIsAnalyticsCollectionEnabled Undefined symbol: _APMIsValidTransactionDeviceVerification Undefined symbol: _APMMonitorLogTagOptionKey Undefined symbol: _APMUserDataFieldEmailAddress Undefined symbol: _APMUserDataFieldHashedEmailAddress Undefined symbol: _APMUserDataFieldHashedPhoneNumber Undefined symbol: _APMUserDataFieldPhoneNumber Undefined symbol: _OBJC_CLASS_$_APMAdExposureReporter Undefined symbol: _OBJC_CLASS_$_APMAnalytics Undefined symbol: _OBJC_CLASS_$_APMConditionalUserProperty Undefined symbol: _OBJC_CLASS_$_APMConditionalUserPropertyController Undefined symbol: _OBJC_CLASS_$_APMEvent Undefined symbol: _OBJC_CLASS_$_APMIdentifiers Undefined symbol: _OBJC_CLASS_$_APMIdentity Undefined symbol: _OBJC_CLASS_$_APMMeasurement Undefined symbol: _OBJC_CLASS_$_APMScreenViewReporter Undefined symbol: _OBJC_CLASS_$_APMUserAttribute Undefined symbol: _OBJC_CLASS_$_APMValue Undefined symbol: _OBJC_CLASS_$_MTGAdChoicesView Undefined symbol: _OBJC_CLASS_$_MTGBannerAdView Undefined symbol: _OBJC_CLASS_$_MTGBidNativeAdManager Undefined symbol: _OBJC_CLASS_$_MTGBidRewardAdManager Undefined symbol: _OBJC_CLASS_$_MTGBiddingSDK Undefined symbol: _OBJC_CLASS_$_MTGMediaView Undefined symbol: _OBJC_CLASS_$_MTGNewInterstitialAdManager Undefined symbol: _OBJC_CLASS_$_MTGNewInterstitialBidAdManager Undefined symbol: _OBJC_CLASS_$_MTGRewardAdManager Undefined symbol: _OBJC_CLASS_$_MTGSDK Undefined symbol: _OBJC_CLASS_$_MTGSplashAD Undefined symbol: _OBJC_METACLASS_$_APMAdExposureReporter Undefined symbol: _OBJC_METACLASS_$_APMConditionalUserProperty Undefined symbol: _OBJC_METACLASS_$_APMConditionalUserPropertyController Undefined symbol: _OBJC_METACLASS_$_APMEvent Undefined symbol: _OBJC_METACLASS_$_APMIdentifiers Undefined symbol: _OBJC_METACLASS_$_APMMeasurement Undefined symbol: _OBJC_METACLASS_$_APMScreenViewReporter Undefined symbol: _OBJC_METACLASS_$_APMUserAttribute Undefined symbol: _OBJC_METACLASS_$_APMValue XCODE 打包报错
最新发布
07-27
在Xcode打包过程中,出现`Undefined symbols for architecture`错误通常意味着链接器无法找到某些符号(如类、函数、变量等)的定义。如果这些符号与APM(应用性能管理)相关,则问题可能与第三方APM库的集成、配置或构建设置有关。 ### 常见原因与解决方案 #### 1. 缺少APM库的链接 如果项目中使用了APM SDK,但在构建时未正确链接其二进制文件(如`.a`、`.framework`、`.xcframework`),则会导致符号未定义错误。检查是否在`Build Phases > Link Binary With Libraries`中添加了所有必要的APM依赖库。 确保以下内容: - 所需的APM框架已正确添加。 - 使用CocoaPods时,确认`Podfile`中包含正确的APM依赖项,并执行了`pod install`[^1]。 #### 2. 构建配置问题 在某些情况下,APM库可能仅在特定构建配置(如Debug)中启用,而在Release或Archive构建中被排除。这可能导致打包时出现未定义符号。 解决方法: - 检查`Build Settings > Other Linker Flags`,确保APM相关标志(如`-ObjC`、`-framework "APMSDK"`)适用于所有构建配置。 - 确保在Archive构建时未禁用APM模块或条件编译宏(如`#ifdef APM_ENABLED`)未生效[^1]。 #### 3. Bitcode设置不一致 如果APM库不支持Bitcode,但项目构建设置中启用了Bitcode,则可能导致链接失败。 解决方法: - 进入`Build Settings > Enable Bitcode`,将其设置为`NO`,特别是对于ReleaseArchive配置[^1]。 #### 4. 使用CocoaPods时的依赖未正确构建 如果APM SDK通过CocoaPods集成,但Pod未正确构建或未与主项目同步,也可能导致符号缺失。 解决方法: - 删除`Pods/`目录、`Podfile.lock``build/`缓存。 - 执行`pod deintegrate`后再次运行`pod install --repo-update`。 - 确保Xcode项目中Pods子项目的构建架构与主项目一致[^1]。 #### 5. 架构限制(Architectures)设置不当 如果APM库不支持某些CPU架构(如`arm64`、`x86_64`等),而项目构建时强制包含这些架构,可能导致链接失败。 解决方法: - 检查`Build Settings > Architectures`,确保主项目与Pod项目的架构设置一致。 - 如果APM不支持模拟器架构(如x86_64),在Archive构建时应排除该架构[^1]。 #### 6. Swift与Objective-C混编问题 如果APM库是Objective-C编写,并在Swift项目中使用,但未正确桥接或导入,也可能导致符号找不到。 解决方法: - 确保桥接头文件(Bridging Header)中正确导入APM头文件。 - 检查是否启用了`Defines Module``Product Module Name`设置,以便Swift能正确识别Objective-C模块[^1]。 #### 7. 使用静态库时未正确处理依赖传递 如果APM SDK本身依赖其他静态库或系统框架(如`CoreTelephony`、`SystemConfiguration`),而这些依赖未被显式链接,则可能导致链接失败。 解决方法: - 在`Build Phases > Link Binary With Libraries`中添加APM依赖的系统框架。 - 确认静态库是否支持当前的iOS部署目标架构[^1]。 --- ### 示例:检查Other Linker Flags设置 ```bash OTHER_LDFLAGS = ( "-framework \"APMSdk\"", "-ObjC", "-framework \"Pods-YourApp\"", ); ``` --- ### 示例:排除模拟器架构以避免冲突 在`Build Settings > Excluded Architectures`中添加: ``` x86_64 ``` 适用于ReleaseArchive配置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值