C代码跨平台移植
跨平台是软件开发中一个重要的概念,即不依赖于操作系统,也不信赖硬件环境。
一段程序写完后不需修改源代码,仅需在对应的平台上编译即可运行。
很多语言提供了不同平台下的Runtime/中间件/虚拟机环境,天然支持跨平台特性,像java、python、php等,程序员不需要考虑太多底层硬件差异。
C程序员就没这么便利了,操作系统、硬件的差异需要在代码层面就考虑到,使用各种不同的宏定义,来适应不同的操作系统和硬件。
编译器会内置各种不同的宏定义,告知程序员当前系统和硬件信息,比如:
__linux__ //当前系统为Linux
__x86_64__ //CPU为x86架构, 64位
目前基本不涉及跨系统移植,主要还是跨硬件体系架构移植,比如x86, ARM, TILERA, Cavium等,
理论上,使用标准C/C++代码,不同平台的编译器都能自动生成对应平台的机器码,但很多特殊细节要注意:
1-汇编
C代码中通常为了提高性能,可能会使用内嵌汇编,汇编是和指令集密切相关,是不能跨平台的。
2-原子变量
很多平台都支持这个特性,但名称可能不一样,不要直接使用原生定义,最好用宏代替。
3-特殊指令优化
使用了特定硬件平台的特殊指令集优化,如x86 SSE4,此类代码无法直接移植到其他硬件平台。
4-大小端
只在本机内运行的程序还好,但要在不同类型的主机之间网络通信时,尤其要注意。
5-变量长度
虽然目前大多数都是64位CPU,但有些嵌入式设备还是32位,编码时对变量的长度要使用sizeof(), 让编译器自动计算长度,不要自己设常量。
因变量长度可能不一致,还要考虑结构体多个变量的内存对齐问题,否则可能影响性能。
6-开启编译器所有警告
即-Wall选项,尽可能早的让编译器发现一些问题隐患,即便不涉及跨平台移植,也强烈建议开启。
最近在把某项目代码移植到申威架构上,就遇到了上述一些问题,暂时还处于解决编译、链接问题的阶段,
目前刚刚编译完成,但程序无法运行,以后真正运行可能还有更多坑,再更新!