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也支持自定义宏,在代码里,也可以通过宏来对不同的架构做区别处理,例如,同样一段功能,通过宏定义的控制条件来区分不同架构下的实现方式,这样在编译时指定宏定义,就可以在同一个代码文件下适配多种架构。