xcodebuild命令行编译错误问题解决
在最近一次迭代中,项目引入了两个新的第三方子项目工程,本地代码使用Xcode工具手动编译没有问题,但使用Jenkins搭建的打包服务器编译时就出错。
Jenkins编译 错误一:
最开始遇到的错误信息:在指定的路径找不到编译的好的.a静态库
解决方法:在Xcode的Build Phases --> Target Dependencies中加入新增的子项目;
分析:在复合项目中,确保Targets之间正确的依赖关系,只有建立了正确的依赖关系,在使用xcodebuild命令行编译时,才能在在下面目录下创建编译后的文件目录:
/Users/xxx/Project_Path/TARGETS_PATH/build/Release-iphoneos/XXX.a
正常使用Xcode编译,静态库文件是在Xcode的如下路径(也是项目的Products目录下):
/Users/xxx/Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphoneos
参考链接:
参考Apple官网的Project Editor Help文档
Jenkins编译 错误二:
问题:
ld: library not found for -xxx
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法:在主项目Build Phases --> Link Binary with Libraries 选项中,讲子项目编译后的路径手动引入进来。因为xcodebuild命令行编译使用的是子项目编译后的绝对目录路径。
Jenkins编译 错误三:
解决了上面问题后再尝试编译,发现问题:Undefined symbols for architecture arm64
问题发现: 发现在其中一个子项目中,Build Settings中的Architectures中添加了armv7s的编译选项,并且在Build Active Architectures Only中Debug设置为No(Debug模式下编译全部支持的architecture版本),Release设置为Yes(在Release模式下仅编译当前设备的architecture版本);
解决方法: 移除Build Settings中Architectures的armv7s编译选项,将Build Active Architectures Only中Debug设置为YES(仅编译当前连接设备的architecture),Release设置为No(编译全部支持的architecture版本);
分析:Architectures 和Build Active Architectures Only这个两个属性
Architectures:
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.
该编译选项指定了工程将被编译成支持哪些指令集,支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。
Build Active Architecture Only
Description: | Boolean value. Specifies whether the product includes only object code for the native architecture. |
Values: |
|
Default value: |
NO |
这个属性设置为Yes,是为了Debug的时候编译速度更快,它只编译当前的architecture版本。
而设置为No时,会编译所有的Architectures版本。
这个是设备对应的Architecture:
iOS Devices: Releases, Firmware, Instruction Sets, Screen Sizes
编译出的版本是向下兼容的,比如你设置此值为Yes,用iPhone4编译出来的是armv7版本的,iPhone5也可以运行,但是armv6的设备就不能运行。
所以,一般Debug的时候可以选择设置为Yes,Release的时候要改为No,以适应不同设备。
参考链接:
Xcode设置项之Architectures和Valid Architectures
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!