不同平臺編譯器區別及遷移注意事項
Sun Studio ,AIX xlc,及gcc使用方法:
簡介:
Sun Studio編譯器支持sun公司出產的sparc處理器,及x86體系機構的處理器。目前最新版本爲5.10,5.3以後的版本對C語言c89、c99標準都支持。可以通過-xc99指定編譯器按特定c語言標準編譯。
XL C/C++是基於標準的命令行編譯器,用於在基於 POWER 處理器的系統上運行的 UNIX操作系統AIX,也有linux版本。XL C/C++ 不僅使用 IBM POWER、POWER3™ 和 POWER4™ 的功能,而且還添加了對新的 POWER5™ 和 POWER 970 處理器的支持。
由於各平臺cpu指令集都不一樣,往往相應平臺專屬編譯器對指令的優化時最好的,如果沒有特殊要求,建議使用本平臺編譯器。gcc編譯器是跨平臺編譯器,對於指令的優化沒有專屬編譯器做的好,但是目前cpu處理速度可以彌補這方面的缺陷,也就說優化與不優化程序的執行時間相差不會太大,那麼爲了減少因編譯器的不同導致編譯時帶來的工作量,可以使用gcc編譯器。
如果使用c語言作爲開發語言,那麼不同編譯器間的遷移不會帶來很大的麻煩,因爲c語言標準到c99後沒有再做大規模的更新。編譯器都是按照標準來編譯c代碼的。
如果使用c++語言作爲開發語言,不同編譯器間的遷移就會帶來一些問題,尤其對模版的支持,各編譯器有很大差別。
相同點:
-c 編譯爲目標文件,不連接。
-S 編譯爲彙編代碼。
-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大端字節序。
第三方依賴庫
分析以前平臺使用的軟件如tuxedo,oracle,還有一些開源庫,如果在AIX都有安裝版本,就沒有問題。
操作系統的選擇
如果程序中大量使用系統函數、進程間通信、信號量、共享內存,需要檢查操作系統支持的Unix標準。目前大多數Unix系統都符合Posix.1和Posix.2的某個版本。如果程序中使用Posix線程或者system v IPC,那麼新的操作系統對這些都應該支持。如果不支持,應該分析修改代碼的代價。
編譯器的選擇
需要根據開發程序時使用的c語言標準,選擇編譯器。Sun平臺編譯器爲Sun Studio,IBM平臺的編譯器爲xlc,跨平臺編譯器gcc,各自平臺專屬編譯器能夠編譯出發揮本機器最佳性能的可執行碼。
代碼分析
C源程序是否能夠兼容目標系統是一個潛在風險,因爲C/C++程序的跨平臺性最主要的障礙是編譯器和操作系統還有某些功能實現技術差異。即使存在相應的編譯器標準,UNIX標準,但是很難保證系統沒有使用編譯器或者操作系統特別的擴展功能。