不同平台编译器区别及迁移注意事项

Sun Studio  ,AIX xlc,gcc使用方法:

简介:

    Sun Studio编译器支持sun公司出产的sparc处理器,及x86体系机构的处理器。目前最新版本为5.105.3以后的版本对C语言c89c99标准都支持。可以通过-xc99指定编译器按特定c语言标准编译。
    XL C/C++是基于标准的命令行编译器,用于在基于 POWER 处理器的系统上运行的 UNIX操作系统AIX,也有linux版本。XL C/C++ 不仅使用 IBM POWERPOWER3™ POWER4™ 的功能,而且还添加了对新的 POWER5™ POWER 970 处理器的支持。
    由于各平台cpu指令集都不一样,往往相应平台专属编译器对指令的优化时最好的,如果没有特殊要求,建议使用本平台编译器。gcc编译器是跨平台编译器,对于指令的优化没有专属编译器做的好,但是目前cpu处理速度可以弥补这方面的缺陷,也就说优化与不优化程序的执行时间相差不会太大,那么为了减少因编译器的不同导致编译时带来的工作量,可以使用gcc编译器。
    如果使用c语言作为开发语言,那么不同编译器间的迁移不会带来很大的麻烦,因为c语言标准到c99后没有再做大规模的更新。编译器都是按照标准来编译c代码的。
    如果使用c++语言作为开发语言,不同编译器间的迁移就会带来一些问题,尤其对模版的支持,各编译器有很大差别。

相同点:

    -c 编译为目标文件,不连接。
    -S
编译为汇编代码。
-Dname=definition... 在命令行上定义宏,有两种方式,-Dname或者-Dname=definition.在命令行上设置宏定义的目的主要是为了在调试的时候设定一些开关,而在发布的时候再关闭或者打开这些开关即可,当然宏定义也用来对代码进行有选择地编译.另外也还有其他的一些作用。
-Uname 取消宏定义name,作用和上面的正好相反。
-Idir...  dir加到头文件的搜索路径中。
-llibrary 在连接的时候搜索library库。
-Ldir... dir加到库文件的搜索路径中。、
-o outfile  指定输出文件的文件名。
-g 产生供gdb调试用的可执行文件。
-Rplst将动态库搜索路径生成到可执行文件中。
-E 对源文件进行预处理,并将结果发送到stdout
-H 打印包含文件的路径名称
-mt 编译和链接多线程代码。
编译静态库:
        ar –cr libmyfun.a fun.o
        -c 如果存档文件不存在,则创建,并不显示ar发出的警告。
-r  向存档文件中插入.o文件,替换已有的任何同名文件,新成员添加到文档末尾。
注意:solaris上如果同一目录下既有动态库,又有静态库,连接时使用的动态库文件。

区别:

Sun Studio

查询编译器版本
    cc –V
指定按那个版本的c标准进行编译:
    使用c99标准
        cc -c -xc99=%all
    使用c89标准
        cc -c -xc99=%none
指示编译器执行更严格的语义检查
    cc –c -v
-xO 设置优化级别。
编译动态库:
    编译源程序:
        cc –c fun.c
        cc –c main.c
生成动态库:
        cc –G –o libmyfun.so fun.o
    连接为可执行程序:
        cc –o demo mian.o –L. –lmyfun
    程序运行时,需要将动态库文件的路径加载到环境变量LD_LIBRARY_PATH中。

xlc

    查看版本
        xlc –qversion
    指定使用哪种C语言标准
        -qlanglvl=stdc89
        -qlanglvl=stdc99
    创建动态库
        xlc -qmkshrobj -o big_lib.so lib_a.o lib_b.o lib_c.o
    设置优化级别
        xlc myprogram.c -O3
    设置警告级别
        xlc myprogram.c -qinfo=all

gcc

查询编译器版本:
    gcc –v
指定使用哪种C语言标准:
-std=standard  设置采用的标准,该选项是针对C语言的,比如-std=c99表示编译器遵循C99标准.
-W设置警告,可以设置的警告开关很多,通常用-Wall开启所有的警告。
-O 设置优化级别,level可以是0,1,2,3或者s,默认为-O0,即不进行优化处理。
编译动态库:
    编译源程序:
        gcc –c fun.c
        gcc –c main.c
    生成动态库:
        gcc –shared –fPCI –o libmyfun.so fun.o
        -shared 该选项指定生成动态连接库。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
    连接为可执行程序:
        gcc –o demo main.o –L. –lmyfun
    程序运行时,需要将动态库文件的路径加载到环境变量LD_LIBRARY_PATH中。

迁移注意事项

主要考虑一下技术点:
              32位还是64位,CPU类型,CPU字节序,第三方依赖库,操作系统的选择,编译器的选择还有代码分析
       32位还是64
              Solaris AIX都是64位的。
       CPU
              Sun平台使用的是SPARC芯片,aix使用的是power芯片。都支持CPU大端字节序。
       第三方依赖库
分析以前平台使用的软件如tuxedooracle,还有一些开源库,如果在AIX都有安装版本,就没有问题。
       操作系统的选择
              如果程序中大量使用系统函数、进程间通信、信号量、共享内存,需要检查操作系统支持的Unix标准。目前大多数Unix系统都符合Posix.1Posix.2的某个版本。如果程序中使用Posix线程或者system v IPC,那么新的操作系统对这些都应该支持。如果不支持,应该分析修改代码的代价。
       编译器的选择
       需要根据开发程序时使用的c语言标准,选择编译器。Sun平台编译器为Sun StudioIBM平台的编译器为xlc,跨平台编译器gcc,各自平台专属编译器能够编译出发挥本机器最佳性能的可执行码。
       代码分析
       C源程序是否能够兼容目标系统是一个潜在风险,因为C/C++程序的跨平台性最主要的障碍是编译器和操作系统还有某些功能实现技术差异。即使存在相应的编译器标准,UNIX标准,但是很难保证系统没有使用编译器或者操作系统特别的扩展功能。