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:
  • YES: The product includes only code for the native architecture (NATIVE_ARCH).

  • NO: The product includes code for the architectures specified in ARCHS (Architectures).

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,以适应不同设备。

 

参考链接:

Apple官方文档

Xcode设置项之Architectures和Valid Architectures

简书:XCode Build Settings

 

转载于:https://www.cnblogs.com/samniu/p/5264349.html

你可能感兴趣的:(xcodebuild命令行编译错误问题解决)