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

    参考链接:

    Apple官方文档

    Xcode设置项之Architectures和Valid Architectures

    简书:XCode Build Settings

  • 相关阅读:
    Python第一周作业
    turtle库的学习笔记
    绘制五角星
    绘制六角形
    绘制同心圆
    绘制叠加三角形
    Slash And Black Slash/正斜杠和反斜杠
    OpenCv中avi视频的读取问题,以及内部格式要求
    OpenCv和matlab对图像的读取
    个人项目进度
  • 原文地址:https://www.cnblogs.com/samniu/p/5264349.html
Copyright © 2020-2023  润新知