編譯器中動態連接器是哪個
『壹』 linux 動態鏈接和靜態鏈接的區別
兩者區別:a,靜態庫的使用需要:1包含一個對應的頭文件告知編譯器lib文件裡面的具體內容2設置lib文件允許編譯器去查找已經編譯好的二進制代碼b,動態庫的使用:程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫c,依賴性:靜態鏈接表示靜態性,在編譯鏈接之後,lib庫中需要的資源已經在可執行程序中了,也就是靜態存在,沒有依賴性了動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供需要的動態庫,有依賴性,運行時候沒有找到庫就不能運行了d,區別:簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。做成靜態庫可執行文件本身比較大,但不必附帶動態庫做成動態庫可執行文件本身比較小,但需要附帶動態庫鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:striplibtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。動態鏈接庫的特點與優勢首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:1.可以實現進程之間的資源共享。什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。2.將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows就是一個很好的例子。3.甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮。
『貳』 請問C++的編譯器都有哪些
網上找的,呵呵
1.Borland C++ Compiler 5.5
「Borland C/C++ 5.5.1 for Win32」是Borland公司在2000年免費放出的一個C/C++編譯器,其功能完整、包含多種SDK,且容量極小,安裝版本大小僅8MB。Borland公司的旗艦級產品「C++ Builder 5」內置的就是這一編譯器。
2.Dev-C++ 5.0
是Bloodshed軟體公司於2002年9月26日推出的一個基於MingW(即GNU C/C++的Win32版)的微型C/C++開發工具。由於使用了GNU C/C+內核,所以在做軟體移植時非常的方便,你可以方便的將一個程序移植到任意一個有GNU C/C++的平台。而且由於基於GNU C/C++的開放源代碼軟體很多,所以使用Dev-C++是一個很好的選擇。但由於它的調試不便,幫助不全等問題,也使得它在推廣上舉步艱難,遠比不上Borland C/C++、OpenWatcom C/C++這兩個同是免費的編譯器。
3.DJGPP
DJGPP是基於32位保護模式的C語言編譯器,是一個GNU軟體,換句話說,你可以得到它整個系統的源代碼,且可以任意修改。它的集成環境RHIDE是仿Borland C++ 3.1的,十分好用,這比Watcom C要強多了。
4.LCC-Win32
運行於Windows9x/Me/NT/2000下的免費的32位C語言編譯系統。它的原始發布文件只有 3M,但卻擁有一個功能強大的集成開發環境(IDE)、速度極快的編譯器與連接器、方便順手的調試器、資源編輯器和版本控制系統。另外還提供圖像編輯器和 C 語言源文件格式化縮進器等附加工具。通過它的應用程序向導,你可以單擊幾次滑鼠輕松得到一個應用程序框架,絲毫不比其它龐大的同類軟體遜色。 你可以用LCC-Win32開發32位的控制台程序、Windows常規程序、動態連接庫(DLL) 以及靜態連接庫(LIB)。LCC編譯器支持標準的ANSI C,同時支持 C語言的擴展。通過下載相關工具,LCC-Win32還提供對Eiffel、Fortran語言的支持。
5.OpenWatcom:Watcom系統編譯器是加拿大Watcom公司開發的Intel x86體系16/32位編譯器,其最新版是11.0c。
Watcom C/C++的集成開發環境極差,不像Borland C/C++和Visual C/C++那樣有漂亮的界面,編譯連結不過輕輕一點。Watcom C/C++的大部分使用者都在命令行下編譯程序。想想吧!一個需要在命令行下編譯程序的編譯器,怎麼匹敵Borland C/C++和Visual C/C++,甚至是C++ Builder呢?
現在我們所用到的OpenWatcom C/C++ 1.0便是Watcom C/C++ 11.0c開放後的版本,它是免費、而且開放源碼的。
6.當然還有我們經常看見的TC2.0 TC3.0 Borland C++3.1 等
需要付費的編譯器(有些允許有評估期的免費下載):
Borland C++
Comeau C++ - 支持多平台
Compaq C++
Digital Mars C++
Edison Design Group C++ Front End - 被許多C++編譯器廠商採用
Green Hills C++ - 支持嵌入式系統平台
HP C++
IBM C++
Intel C++ - 支持Windows, Linux, 和其他嵌入式系統
Interstron C++
Metrowerks C++ - 支持多平台,可從Metrowerks主頁上查詢
Mentor Graphics/Microtec Research C++ - 支持嵌入式系統平台
Microsoft C++
Paradigm C++ - 支持x86嵌入式系統
The Portland Group C++ - 針對奔騰CPU優化
SGI C++ - 優化的編譯器
Sun C++
WindRiver's Diab C++ - 用於很多嵌入式系統
『叄』 編譯器跟編輯器有什麼區別。還有什麼是鏈接器
鏈接器(Linker)是一個程序,將一個或多個由編譯器或匯編器生成的目標文件外加庫鏈接為一個可執行文件。
是軟體程序,一般是指用來修改電腦檔案的編寫軟體,但也有人稱 PE2、HE4(漢書)……等文書軟體為編輯器。常見的編輯器有文本編輯器、網頁編輯器、源程序編輯器、圖像編輯器,聲音編輯器,視頻編輯器等。
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)
『肆』 簡述一下編譯器和鏈接器的作用
1、編譯器:
編譯器對源文件進行編譯,就是把源文件中的文本形式存在的源代碼翻譯成機器語言形式的目標文件的過程,在這個過程中,編譯器會進行一系列的語法檢查。如果編譯通過,就會把對應的CPP轉換成OBJ文件。
2、鏈接器:
當鏈接器進行鏈接的時候,首先決定各個目標文件在最終可執行文件里的位置。然後訪問所有目標文件的地址重定義表,對其中記錄的地址進行重定向(加上一個偏移量,即該編譯單元在可執行文件上的起始地址)。
然後遍歷所有目標文件的未解決符號表,並且在所有的導出符號表裡查找匹配的符號,並在未解決符號表中所記錄的位置上填寫實現地址。最後把所有的目標文件的內容寫在各自的位置上,再作一些另的工作,就生成一個可執行文件。