C代码跨平台移植

标签:c   跨平台   移植    2485人阅读 评论(0)
分类:

    跨平台是软件开发中一个重要的概念,即不依赖于操作系统,也不信赖硬件环境。

    一段程序写完后不需修改源代码,仅需在对应的平台上编译即可运行。

    很多语言提供了不同平台下的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选项,尽可能早的让编译器发现一些问题隐患,即便不涉及跨平台移植,也强烈建议开启。



    最近在把某项目代码移植到申威架构上,就遇到了上述一些问题,暂时还处于解决编译、链接问题的阶段,

    目前刚刚编译完成,但程序无法运行,以后真正运行可能还有更多坑,再更新!


查看评论

暂无评论

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1