Xcode 编译报错汇总

2020/02/27 Xcode 共 2609 字,约 8 分钟

公司主要做 Untiy 开发,Untiy 导出的 Xcode 工程经常会遇到一些编译错误,这里记录下遇到的报错和解决办法。其中问题描述尽量使用文字,以后可以复制 Xcode 中的错误日志来搜索。解决办法则尽可能添加图片说明,方便不熟悉 Xcode 的人使用。


未定义符号

Undefined symbols for architecture arm64: “0BJC_CLASS_$_CLLocationmanager”, referenced from: objc-class-ref in libyim.a (Geographylocation.o)

这是出现过很多次的问题,一些 SDK 需要添加一些依赖库,但没有添加上。

解决办法

根据提示,说明 libyim.a 引用到了未定义的符号,所以先查找_CLLocationmanager 的来源,发现属于 CoreLocation.framwork,这是一个系统库。在 Build Phases 里添加依赖即可:


Armv7 的编译错误

B/bl/blx thumb2 branch out of range (71414688 max is+/-16MB)

Untiy 开发人员反馈最近添加了 libuwa.a 库后出现这样的报错,但在 Xcode 工程中将此库删除并重新添加后又不报错了。

测试发现,在 Xcode 的 Build Phases 中将此库调整顺序后也不报错。

解决办法

最终在网上找到了原因,这是一个已知的 armv7 编译器链接错误,可以删除该库重新导入,或者将 Xcode 工程 BuildSetting 中的 Architectures 中的 armv7 删除掉:

参考:https://groups.google.com/forum/#!topic/pdfnet-sdk/b4EoBiH_zjc


Xcode 控制台 po text 报错

error: Couldnt materialize: couldnt get the value of variable text: variable not available error: errored out in Doexecute, couldn’t Preparetoexecutejit Expression

Xcode 调试时明明有值却显示 nil,po 命令报出现上面的提示。

解决办法

这是工程编译策略的问题,先找到运行的 Build Configuration,这里是 Debug

然后去 Build Settings 里搜索 Optimization Level,将 Debug 选项中的 fastest, Smallest[-Os] 改为 None。


真机调试报错

iPhone has denied the launch request. Internal launch error: process launch failed: failed to get the task for process 1304

Xcode 在手机上运行后卡在启动页,Xcode 提示如上。

暂时的解决办法

去 Edit Scheme 里将 Executable 改为 Ask on Lanuch。目前还没找到真正有效的解决方法,网上说是 Xcode 的 bug,暂时这样解决。


C++ 混编使用 @import 错误

use of @import when modules are disabled

使用 FaceBook 的 SDK 时,它的有个头文件使用了@import的写法,编译时出现这个报错。

解决办法

这是因为我们工程中存在.mm后缀的C++文件,需要在 Xcode 工程 Build Settings 中 将 Enable Modules 设置为 Yes。

然后搜索other c++ flags,添加-fcxx-modules-fmodules符号。


在 Xcode 中使用动态库

dyld: Library not loaded: @rpath/AdjustSdk.framework/AdjustSdk Referenced from: /private/var/containers/Bundle/Application/AD1BBE93-2E11-462B-AA2E-F5161C99345F/yjcq.app/Frameworks/npplaygamesdk.framework/npplaygamesdk Reason: image not found

直接往 Xcode 工程中拖入一个库,编译虽然可以通过,但运行时会报一个 image not found 的错误,然后闪退。

解决办法

这是因为 AdjustSdk.framework 是一个动态库,往 Xcode 添加动态库时需要去 General 中找到该库,将 Do not Emebd 改为 Embed & sign


区分动态库和静态库

打开终端,使用 cd 命令进入 xxx.framework, 然后使用 file 命令查看该二进制文件,动态库会有 Mach-O dynamicallly 的标识。


Modules 报错

Include of non-modular header inside framework module

导入一个 framework 后它的头文件出现报错。

解决办法

去 Xcode 的 Build Setting 中将此项改为 Yes。


Xcode 新的 Build System 问题

Multiple commands produce’/Users/zhangning/LibraryDeveloper/Xcode/DerivedData/UnityiPhone-beisrzhtuoxouebivefvjbofagvBuid/Products/Debug-iphoneos/test.app/Info.pist’…

操作大概是删除了工程中的 Info.plist 再重新添加进去,然后报上面的错。

解决办法

去 Build Phases 的 Copy Bundle Resource 里将 Info.plist 删除。

如果不能解决可以去 Xcode 的 File > Project Settings 中选择使用旧的 Legacy Build System。


使用 @try 捕获异常

Cannot use ‘@try’ with Objective-C exceptions disabled

OC 中使用 @try{} @catch{} @finally{} 的地方出现这种报错。

解决办法

去 Xcode 的 Build Setting 中将 Enable Objective-C Exception 改为 Yes。

在 iOS 中很少见人用这个,大家普遍使用 NSError 来处理异常。据说 Arc 下使用 Exception 不安全,存在内存管理问题,暂未详细了解。


文档信息

Search

    Table of Contents