xcode中的.a 静态库64位的问题


我在编译支持 64位的app 时,有些静态库必须是 支持64位的才能编译通过,有些直接用32位就能通过。

我现在迷惑的是,静态库在哪些地方需要区别对待 32位 64位 ?

ios8 ios6 ios7

哲学系政委 11 years ago

参考: http://blog.csdn.net/keyboardota/article/details/11993883

32位的iOS系统和64位的iOS系统主要的差别有两个,一个是数据类型的差别,一个是过程调用方法的差别。


 在数据类型上,主要的变化是指针类型(Pointer)和长整数类型(long)的长度变化和内存对齐方式的变化,同时也导致了更高级别数据类型的变化,如NSInteger的长度也有变化。

在过程调用方法上,因为ARM V8 和ARM V7具有不同数量的寄存器,具有不同的过程调用约定,所以32位系统和64位系统在汇编层级是不同的。

根据以上两方面的变化,书中总结了以下要点,开发人员根据以下要点来检查原来的32位代码就差不多可以将应用移植到64位系统上了:

  1. 不要将长整型数据(long)赋予整型(int)
    这种代码在32位系统上没有问题,因为在32位系统中long和int的长度是一样的,不过在64位系统中就有可能出问题,因为64位系统中long比int长,将long值赋予int将导致数据丢失。

  2. 不要将指针类型(Pointer)赋予整型(int)
    为了方便地址计算,有时程序员会将指针类型赋予整型,这种代码在32位系统上没有问题,因为在32位系统中Pointer和int的长度是一样的,不过在64位系统中就会有问题,因为64位系统中Pointer比int长,将Pointer值赋予int将导致地址数据丢失,最终导致严重问题。

  3. 留意那些和数位相关的数值计算
    比如掩码技术,如果使用一个long类型的掩码,转到64位系统后高位都是0,计算出来的结果可能不符合预期。还有无符号整数和有符号整数的混用等。

  4. 留意对齐方式带来的变化
    如果在32位系统上定义一个结构包含两个long类型,第二个long数值的偏移地址是4,可以通过结构地址+4的方式获取,但是在64位系统上就不行了,因为在64位系统中第二个long数值的偏移地址是8。

  5. 充分考虑在32位应用和64位应用之间的数据交换
    因为用户会通过网络交换数据,同时用户保存的数据也可能通过备份等方式在32位系统和64位系统之间切换,所以应用在保存和发送流数据的时候一定要考虑充分。比如数据在32位系统中保存,在64位系统中能否正常打开,或者反过来,在64位系统中保存,在32位系统中打开是否正常。

  6. 重写所有汇编代码
    这点无需说明,如果你在代码中嵌入了汇编代码,你需要参考64位系统的指令集重写汇编代码。

  7. 不要将可变参数的过程强制转换为定参过程,也不要将定参过程强制转换为可变参数的过程。
    这时因为32位系统和64位系统对于这两种过程调用方式的处理方法不同。

Cassius answered 10 years, 3 months ago

Your Answer