• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2016年8月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910


            專注即時通訊及網游服務端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標準模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216769
            • 排名 - 118

            最新評論

            閱讀排行榜

            C/C++的編譯器|編譯環境(非常全面的比較)

            C/C++編譯器的一些易混淆概念,總結一下。

            關于什么是Unix-like操作系統,常見操作系統間差異,什么是操作系統接口等等,請參考《操作系統寶鑒》。

             

            C/C++編譯器有哪些?

             

            首先是如雷貫耳的這幾位仁兄,MSVC、GCC、Cygwin、MingW(Cygwin和MingW的英文發音),另外還有些小眾和新秀,像ICC(Intel C/C++ Compiler)、BCC(Borland C/C++ Compiler,快銷聲匿跡了)、RVCT(ARM的匯編/C/C++編譯器,內置在ARM的IDE——RVDS中)、Pgi編譯器……其實有一大串,我們只要熟悉常用的最強大的幾款就可以了。

             

             

            主流C/C++編譯器|編譯環境簡介

             

            MSVC

            MSVC是微軟Windows平臺Visual Studio自帶的C/C++編譯器。

            優點:對Windows平臺支持好,編譯快。

            缺點:對C++的新標準支持得少。

             

             

            GCC

            GCC原名GNU C Compiler,后來逐漸支持更多的語言編譯(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),所以變成了GNU Compiler Collection(GNU編譯器套裝),是一套由GNU工程開發的支持多種編程語言的編譯器。GCC是自由軟件發展過程中的著名例子,由自由軟件基金會以GPL協議發布,是大多數類Unix(如Linux、BSD、Mac OS X等)的標準編譯器,而且適用于Windows(借助其他移植項目實現的,比如MingW、Cygwin等)。GCC支持多種計算機體系芯片,如x86、ARM,并已移植到其他多種硬件平臺。

            優點:類Unix下的標準編譯器,支持眾多語言,支持交叉編譯。

            缺點:默認不支持Windows,需要第三方移植才可用于Windows。

             

             

            Cygwin

            Cygwin是一個Windows下Unix-like模擬環境,具體說就是Unix-like接口(OS API,命令行)重定向層,其目的是不修改軟件源碼僅重新編譯就可以將Unix-like系統上的軟件移植到Windows上(這個移植也許還算不上嚴格意義上的無縫移植)。始于1995年,最初作為Cygnus軟件公司工程師Steve Chamberlain的一個項目。

            和GCC的關系:Cygwin是讓Windows擁有Unix-like環境的軟件而不是編譯器,GCC是安裝在Cygwin上的編譯器。

            優點:可以比MingW移植更多的軟件到Windows上,對Linux接口模擬比MingW全面。

            缺點:軟件運行依賴cygwin1.dll,速度受點影響。

             注意:Unix-like模擬環境不是Unix虛擬環境,很多論述中都聲稱Cygwin是在Windows上盡可能模擬類Unix環境,這容易造成誤解,好像類Unix的elf程序可以直接運行在安裝了Cygwin的Windows上一樣。Cygwin和Wine的思路是不同的。在Windows+Cygwin上你可以像類Unix那樣使用命令行和編程,但elf等非exe格式的程序是不能被Cygwin運行的,所以Cygwin和Unix虛擬機、Wine是完全不同的,叫Unix-like環境,模擬非虛擬,是有限的選擇性的模擬,請不要誤解。

             

            MingW

            MingW(Minimalist GNU on Windows)是一個Linux/Windows下的可以把軟件源碼中Unix-like OS API調用通過頭文件翻譯替換成相應的Windows API調用的編譯環境,其目的和Cygwin相同。從而把Linux上的軟件在不修改源碼的情況下編譯為可直接在Win下執行的exe。

            和GCC的關系:MingW是編譯環境,不是編譯器,GCC是MingW中的核心組成。

            優點:在Win下可以和Linux一樣的方式編譯C/C++源碼,可以說是Win版的GCC,其生產的Windows PE程序相比Cygwin不依賴任何第三方庫,比Cygwin純粹,理論上也更快速。

            缺點:編譯速度、編譯出的程序在算法上可能都比MSVC慢。

            注意:與Windows下其它編譯器不同的是,MinGW與Linux下廣泛使用的GNU近乎完全兼容,這意味著,在Linux下如何編譯源代碼,在MinGW中也可以以完全相同的方式編譯。有些Linux下的開發人員(比如開源陣營)發布的源代碼通常只提供Linux下的編譯方式,而不提供Windows下的編譯方式(這可能與其不熟悉windows操作系統有關),但確實有不少用戶需要在在Windows下編譯使用此源代碼。這在種情況下,如果Windows用戶想用VC、BC等編譯器編譯該源代碼,必須重寫Makefile(各種編譯器所支持的Makefile不盡相同),工作量比較大不說,還很難保證不出錯。MinGW的出現,提供了兩個平臺下的“跨平臺編譯方案”。MinGW與MSYS相配合,連./configure都有了。與GNU不同的是,MinGW編譯生成的是Windows下的可執行文件(.exe)或庫文件(.dll,.lib)——不過編譯過程中的的中間文件仍然是.o文件,而不是.obj文件(這當然無所謂了,中間文件嘛,編譯完成后就沒有用了)。

             

             

            在我們對比Cygwin和MingW之前,請先理清一件事,那就是,

            如何從Unix-like系統向Windows系統移植軟件?

             

            現代操作系統包括Windows和Linux的基本設計概念,像進程線程地址空間虛擬內存這些都大同小異,二者之上的程序之所以不兼容,主要是它們對這些功能具體實現上的差異:

            首先,是可執行文件的格式,Window使用PE的格式,并且要求以.EXE為后綴名,Linux則使用Elf。

            其次,操作系統API也同,比如,Windows用CreateProcess()創建進程,而Unix-like系統則使用fork(),其他還有很多諸如spawn、signals、select、sockets等。

            分析之后可知,要把Unix-like系統上的軟件移植到Windows上,有幾種思路:

            第一種:修改軟件源碼并重新編譯,這個方法最笨,類Unix下大量的軟件要修改工作量很大,編譯生成目標平臺可執行文件格式。

            第二種:不修改軟件源碼但把類Unix接口調用悄悄替換為WinAPI,還是需要重新編譯,編譯生成目標平臺可執行文件格式。

            第三種,無縫移植的運行環境,無需重新編譯,在一種OS上建立另一中OS的應用軟件虛擬環境(和虛擬機不一樣),比如Wine(把Windows上的可執行程序直接原樣移植到Linux上)。

             

            Cygwin和MingW的對比

             

            作為編譯環境時,都依賴于GCC

            用它們作編譯環境、交叉編譯,根本上都是因為GCC編譯器的支持,它們做的工作是為GCC的編譯掃除Unix-like、Windows間OS API的差異這個障礙。

             

            二者都必須重新編譯后實現移植,生成的程序都是PE格式

            二者都不能讓Linux下的程序直接運行在Windows上(無縫移植),必須通過源代碼重新編譯。有些人聲稱cygwin支持rpm的壓縮包,注意,rpm壓縮包其實是src.rpm,內部還是源碼而非elf格式,cygwin不支持常規rpm包的安裝。

             

            Cygwin運行在Windows上,MingW運行在Linux或者Windows上

            Cygwin是Windows上運行的Unix-like環境,MingW是運行在Linux或者Windows上的Windows PE編譯環境。

             

            MingW中的子項目MSys和Cygwin更像

            Cygwin除了全面模擬Linux的接口(命令行,OS API),提供給運行在它上面的的Windows程序使用,并提供了大量現成的軟件,更像是一個平臺。MingW也有一個叫MSys(Minimal SYStem)的子項目,主要是提供了一個模擬Linux的Shell和一些基本的Linux工具。因為編譯一個大型程序,光靠一個GCC是不夠的,還需要有Autoconf等工具來配置項目,所以一般在Windows下編譯ffmpeg等Linux下的大型項目都是通過Msys來完成的,當然Msys只是一個輔助環境,根本的工作還是MingW來做的。

             

            實現思路有同有異

            Cygwin和MingW都是第二種軟件移植思路,當然,二者還是有區別,區別就在于“替換”方式,Cygwin編譯時,程序依然以Linux的方式調用系統API,只不過把Unix-like接口link到自己的cygwin1.dll上,然后在cygwin1.dll中重新調用Windows API,cygwin1.dll再調用Windows對應的實現,來把結果返回給程序。也就是說,他們基于Win32 API中寫了一個Unix系統API的重定向層,所以用它移植的軟件都依賴于cygwin1.dll,MingW編譯時通過特有的WinAPI頭文件把類Unix-like調用替換為WinAPI,用它移植的軟件無需依賴第三方庫,可直接運行在Windows平臺。為了達到類Unix軟件僅通過重新編譯移植到Win的目的,Cygwin在運行時偷梁換柱,MingW在編譯時偷梁換柱。

            用一個PE格式查看工具檢查一下就能發現,Cygwin生成的程序依然有fork()這樣的Linux系統調用,但目標庫是cygwin1。而MingW生成的程序,則全部使用從KERNEL32導出的標準Windows系統API。

             

            使用方式有同有異

            把類Unix上的軟件移植到Windows是二者的主要目標,除此之外,順帶的,MingW和Cygwin都可以用來跨平臺開發等等其他事情,

            Windows + Cygwin:可以在Windows上學習Linux命令,還可以在Windows上做Linux軟件的開發,包括用GCC編譯elf(交叉編譯)。

            Linux + MingW:可以在Linux上做Windows軟件的開發,包括用GCC編譯exe(交叉編譯)。

            Windows/Linux + MingW:可以擺脫MSVC的“束縛”,用GNU的自由軟件來編譯生成不依賴第三方庫的純粹Windows PE格式(exe)二進制程序。

             

            Cygwin重量級,MingW輕量級

            與MingW思路一致的,兩者相比,Cygwin是重量級的(需下載50M以上直至數百兆不等,安裝后占用空間可達1G),MinGW是輕量級的(需下載的文件只有20M,安裝后70M左右),這是單純從體積上說的,另外Cygwin現在據說也不是完全免費的了。

             

            網絡上的對比列表(UnxUtils自行無視,僅供參考)

            功能

            UnxUtils

            MinGW

            Cygwin

            設計原理

            原生

            原生

            模擬

            運行依賴

            無依賴

            依賴msys.dll(一定依賴它嗎?值得驗證)

            依賴cygwin.dll

            運行性能(比較)

            最快

            中等

            DOS執行

            可以

            可以

            不可以

            更新速度

            完善停止更新

            較慢

            基本同步gcc

            shell命令

            較多

            較少

            較多

            uname

            WindowsNT

            MINGW32_NT-5.1

            CYGWIN_NT-5.1

            env

            同Windows

            同Windows

            不完全同Windows

            root

            C:/

            C:/

            /

            home

            C:/Documents and Settings/test

            /home/test: No such file or directory

            /home/test

            pwd

            C:/bin

            /usr/bin

            /home/test

            df

            cannot read table of mounted filesystems

            /cygdrive/c

            vi

            gcc套件

            開發庫

            WinAPI

            POSIX

            圖形庫

            GTK/QT

            GTK/QT

            可移植性

            Win32API不可移植

            無縫移植

            程序運行

            原生

            模擬

            程序依賴

            cygwin.dll

            程序性能(比較)

            較快(慢于VC和Linux下的gcc)

            較慢(快于java)

             

             

            小拓展

             

            一個編譯器編譯時能否調用編譯其他編譯器產生的lib、dll?

            不可以,name***不同,也就是名字混淆方式不同。

             

            http://rendao.org/blog/1071/

            posted on 2018-06-13 16:18 思月行云 閱讀(484) 評論(0)  編輯 收藏 引用 所屬分類: C\C++
            久久无码AV一区二区三区| 精品人妻久久久久久888| 久久精品人人槡人妻人人玩AV| 精品久久久久成人码免费动漫| 久久久精品波多野结衣| 一级做a爰片久久毛片人呢| 欧美综合天天夜夜久久| 国内精品久久久久| 精品久久久久久| 99久久久国产精品免费无卡顿 | 亚洲国产小视频精品久久久三级 | 成人久久免费网站| 久久久久青草线蕉综合超碰| 狠狠色丁香婷婷久久综合 | 久久精品夜夜夜夜夜久久| 久久国产精品无码HDAV| 国产一区二区三区久久| 久久AⅤ人妻少妇嫩草影院| 女同久久| 久久久一本精品99久久精品88| 久久久久久久综合日本亚洲| 国产AⅤ精品一区二区三区久久| 久久综合九色综合久99| 久久久久久久精品妇女99| 国内精品久久久久影院免费| 久久亚洲AV无码西西人体| 国产A级毛片久久久精品毛片| 国产成人精品久久一区二区三区 | 91精品国产91久久久久久蜜臀| 国产三级观看久久| 伊人久久久AV老熟妇色| 国内精品久久久久影院优 | 热综合一本伊人久久精品| 日韩久久久久久中文人妻| 国产L精品国产亚洲区久久| 久久精品国产亚洲αv忘忧草| 青青草原综合久久| 99精品久久久久久久婷婷| 九九久久精品无码专区| 久久久久99精品成人片欧美| 性做久久久久久久久久久|