5.2.2 移植总结

对于C/C++为代表的编译型语言来说,移植方法一般包括两种,也就是源代码修改和编译选项修改,有时候使用其中一种方式,有时候两种方式需要同时使用。

1.源代码修改

对于源代码修改的场景,主要分为以下几种:

1)对内嵌的汇编指令的修改

正如在5.1节介绍的那样,x86架构和鲲鹏在汇编指令上完全不同,对于在编译型语言中内嵌的汇编指令,需要根据目标架构指令集的具体情况进行有针对性更改。

2)char数据类型的修改

使用5.2.1节介绍的方法,把char数据类型更改为signed char。

3)双精度浮点型转整型溢出处理的修改

详细见5.2.3节内容。

2.编译选项修改

1)char数据类型默认无符号

对于char数据类型默认无符号问题,除了上面介绍的直接更改代码方法外,还可以使用修改编译选项来解决,就是在编译时指定-fsigned-char选项,这一点在5.2.1节也演示了。当然,如果是从鲲鹏架构移植到x86架构,可以使用-funsigned-char来保持char类型为无符号型。

2)指定编译64位应用

在指定应用编译为64位时,x86架构下需要指定编译选项-m64,但是在鲲鹏架构下不支持这个选项,替代的选择是-mabi=lp64。需要注意的是,不是所有的gcc版本都支持-mabi=lp64选项,只有在4.9.4及以后的版本才支持。

3)目标指令集

在执行编译时,可以指定目标的指令集,使用的是-march编译选项,该选项可以指定的指令集类型非常多,大概有几十种,但是鲲鹏架构目前只对应一种类型,就是ARMv8-a,在编译时可以指定编译选项为-march=ARMv8-a。

4)编译宏

gcc预先内置了各种宏定义,这些宏定义有一部分是和架构有关系的,同时,gcc也支持自定义宏,在代码里,也可以通过宏来对不同的架构做区别处理,例如,同样一段功能,通过宏定义的控制条件来区分不同架构下的实现方式,这样在编译时指定宏定义,就可以在同一个代码文件下适配多种架构。