1. 程式人生 > >終於理解了什麼是c/c++執行時庫,以及libcmt msvcrt等內容

終於理解了什麼是c/c++執行時庫,以及libcmt msvcrt等內容

在各個版本的編譯器中,我們可以通過配置選項來設定程式使用的C和C++執行時庫的型別。如下圖(其他版本編譯器大同小異):

這裡寫圖片描述

MT選項:連結LIB版的C和C++執行庫。在連結時就會在將C和C++執行時庫整合到程式中成為程式中的程式碼,程式體積會變大。 
MTd選項:LIB的除錯版。 
MD選項:使用DLL版的C和C++執行庫,這樣在程式執行時會動態的載入對應的DLL,程式體積會減小,缺點是在系統沒有對應DLL時程式無法執行。 
MDd選項:表示使用DLL的除錯版。

關於C和C++執行庫的概念

  為了提高C語言的開發效率,C標準定義了一系列常用的函式,稱為C庫函式。C標準僅僅定義了函式原型,並沒有提供實現。因此這個任務留給了各個支援C語言標準的編譯器。每個編譯器通常實現了標準C的超集,稱為C執行時庫(C Run Time Library),簡稱CRT。對於VC++編譯器來說,它提供的CRT庫支援C標準定義的標準C函式,同時也有一些專門針對Windows系統特別設計的函式 
  與C語言類似,C++也定義了自己的標準,同時提供相關支援庫,稱為C++執行時庫或C++標準庫。由於C++對C的相容性,C++標準庫包括了C標準庫,除此之外還包括了IO流和標準模板庫STL。

VC++在何處實現C和C++執行庫

  VC++完美的支援C和C++標準,因此也就按照C和C++標準定義的函式原型實現了上述執行時庫。為了方便有不同需求的客戶使用,VC++分別實現了動態連結庫DLL版本和靜態連結庫LIB版本。同時為了支援程式除錯且不影響程式的效能,又分別提供了對應的除錯版本。除錯版本的名稱在Release版本名稱後添加了字母d。

對於C執行時庫CRT,VC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。 
上述各個編譯器提供的LIB版的CRT庫,均實現在libcmt.lib。對應的除錯版名稱為libcmtd.lib。

而DLL版本名稱根據編譯器不同而不同,我們可以從名稱上加以分辨。 
  VC6.使用的CRT庫的DLL版本在MSVCRT.DLL中實現, 對應除錯版本為MSVCRTD.LIB。 
  VC2005使用的CRT庫的DLL版本在MSVCR80.DLL中實現,對應除錯版本為MSVCR80.DLL。 
  VC2008使用的CRT庫的DLL版本在MSVCR90.DLL中實現,對應除錯版本為MSVCR90D.DLL。 
  VC2010使用的CRT庫的DLL版本在MSVCR100.DLL中實現,對應除錯版本為MSVCR100D.DLL。 
  VC2013使用的CRT庫的DLL版本在MSVCR120.DLL中實現,對應除錯版本為MSVCR120D.DLL。

這裡寫圖片描述

對於C++標準庫中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。 
  LIB版均實現在libcpmt.lib中,對應的除錯版本為libcpmtd.lib。 
不同版本的編譯器實現的DLL也不相同。 
  VC6.使用的C++類庫的 DLL版本在MSVCP60.DLL中實現, 對應除錯版本為MSVCP60D.LIB。 
  VC2005使用的C++類庫的DLL版本在MSVCP80.DLL中實現,對應除錯版本為MSVCP80.DLL。 
  VC2008使用的C++類庫的 DLL版本在MSVCP90.DLL中實現,對應除錯版本為MSVCP90D.DLL。 
  VC2010使用的C++類庫的DLL版本在MSVCP100.DLL中實現,對應除錯版本為MSVCP100D.DLL。

這裡寫圖片描述

動態版(DLL)和靜態版(LIB)C和C++執行庫的優缺點

  因為靜態版必須把C和C++執行庫複製到目標程式中(.exe),所以產生的可執行檔案會比較大。同時對於使用多個模組的大型軟體來說,如果每個模組均選擇靜態連結C或C++執行庫,在程式執行時就會存在多個執行庫。在連結時也會出現重複定義的問題,如圖所示。

這裡寫圖片描述

  使用DLL版的C和C++執行庫,程式在執行時動態的載入對應的DLL。程式體積變小,但一個很大的問題就是一旦找不到對應DLL,程式將無法執行(比如所要移植的電腦沒有安裝VC++)。假設使用VC6.0並選擇使用MD選項構建,那麼當用戶使用VC2005來使用這個DLL時很可能出現找不到MSVCRT.DLL或MSVCP60.DLL的情況。


相關推薦

終於理解什麼是c/c++執行以及libcmt msvcrt內容

在各個版本的編譯器中,我們可以通過配置選項來設定程式使用的C和C++執行時庫的型別。如下圖(其他版本編譯器大同小異):MT選項:連結LIB版的C和C++執行庫。在連結時就會在將C和C++執行時庫整合到程式中成為程式中的程式碼,程式體積會變大。 MTd選項:LIB的除錯版。 M

如何理解C run-time library(C執行)

 )執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式. 2)C 語言是所謂的“小核心”語言,就其語言本身來說很小(不多的關鍵字,程式流程控制,資料型別等);所以,C 語言核心開發

[轉]CC++執行

轉自csdn原文:https://blog.csdn.net/ithzhang/article/details/20160009 圖片請去原文檢視 在使用VC構建專案時,經常會遇到下面的連結錯誤:   初學者面對這些錯誤常常不知所錯:libcmt.lib是什麼東西?msvcrtd.dll又是幹嗎用的?在

什麼是c執行

nafxcw.lib 和 libcmt.lib衝突問題。 解決辦法: 屬性設定裡讓程式先找到nafxcw.lib. 解決辦法參考:https://www.cnblogs.com/suiyingjie/archive/2012/10/29/2745031.html 從vs2008 工程

C執行C Run-time Library)詳解

一、什麼是C執行時庫1)C執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式.2)C 語言是所謂的“小核心”語言,就其語言本身來說很小(不多的關鍵字,程式流程控制,資料型別等);所以,C 語言核心開發出來之後,De

CRT(C Runtime Library)—— C/C++執行

C runtime library(part of the C standard library) 任何一個 C 程式,它的背後都有一套龐大的程式碼來進行支撐,使得該程式得以執行在更高級別上,而不必擔心同計算機底層操作的細節,這套程式碼至少包括:

C/C++執行到底在Windows中起什麼作用(猜想)

以下是作者的一些猜想: 1. 我們在用VC程式設計時,會在執行我們的main函式前,系統先通過Kernel32呼叫一些函式,執行一些C的初始化準備工作,我們一般叫C執行時庫的初始化。那麼這些初始化的作用是什麼?是否是必要的?不知道大家有沒有思考過這個問題。 以下是我對這

C執行Visual C++ C RunTime Lib

CRT 全稱:Visual C++ C RunTime Lib 就是C執行時庫。 注: 以下內容部分引自CSDN中相關討論的帖子,並結合自己的理解整理而成。僅供參考。 1)執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個

[轉]CC++運行

alloc 靜態 開發 dialog 遇到的問題 高版本 pri 工作 系統 轉自csdn原文:https://blog.csdn.net/ithzhang/article/details/20160009 圖片請去原文查看 在使用VC構建項目時,經常會遇到下面的鏈接錯誤:

C語言執行資料結構

段(Segment): 物件檔案/可執行檔案: SVr4 UNIX上被稱為ELF(起初"Extensible Linker Format", 現在"Executable and Linking Format")檔案。BSD UNIX上被稱為a.out。這些格式都具有段的概念 sectio

C++標準執行之當前執行緒管理

有時需要對當前執行的子執行緒進行一些額外的處理,如:使執行緒休眠一段時間,再次排程等。C++11標準庫提供了管理當前執行緒的函式,這些函式都定義於名稱空間this_thread 1. 獲取當前執行緒

C++多執行筆記1

來源:C++ 11 多執行緒 課程介紹 併發:同一時間間隔 並行:同一時刻 多程序:程序間通訊:檔案、管道、訊息佇列 多程序:共享記憶體 C++多執行緒庫<thread> 建立一個執行緒 thread t(callable); 其中callable為可呼叫物件

C++11 | 執行型別識別(RTTI)

type_info類 typeid操作符 type_index類 type_info type_info類在標頭檔案<typeinfo>中定義,代表了一個C++型別的相關資訊。一般由t

Objective-C Runtime 執行之五:協議與分類

Objective-C中的分類允許我們通過給一個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的程式碼就可以做到。 Objective-C中的協議是普遍存在的介面定義方式,即在一個類中通過@protocol定義介面,在另外

Objective-C Runtime 執行之六:拾遺

前面幾篇基本介紹了runtime中的大部分功能,包括對類與物件、成員變數與屬性、方法與訊息、分類與協議的處理。runtime大部分的功能都是圍繞這幾點來實現的。 本章的內容並不算重點,主要針對前文中對Objective-C Runtime Reference內容遺漏

C++程式執行記憶體佈局之----------區域性變數全域性變數靜態變數函式程式碼new出來的變數

宣告兩點: (1)開發測試環境為VS2010+WindowsXP32位; (2)記憶體佈局指的是虛擬記憶體地址,不是實體地址。   1.測試程式碼 #include <iostream> using namespace std; int g_int_a; i

Objective-C Runtime 執行之一:類與物件

Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一

Objective-C Runtime 執行之二:成員變數與屬性

在前面一篇文章中,我們介紹了Runtime中與類和物件相關的內容,從這章開始,我們將討論類實現細節相關的內容,主要包括類中成員變數,屬性,方法,協議與分類的實現。 本章的主要內容將聚集在Runtime對成員變數與屬性的處理。在討論之前,我們先介紹一個重要的概念:型別

Objective-C Runtime 執行之三:方法與訊息

前面我們討論了Runtime中對類和物件的處理,及對成員變數與屬性的處理。這一章,我們就要開始討論Runtime中最有意思的一部分:訊息處理機制。我們將詳細討論訊息的傳送及訊息的轉發。不過在討論訊息之前,我們先來了解一下與方法相關的一些內容。 基礎資料型別 SEL

Objective-C Runtime 執行之四:Method Swizzling

理解Method Swizzling是學習runtime機制的一個很好的機會。在此不多做整理,僅翻譯由Mattt Thompson發表於nshipster的Method Swizzling一文。 Method Swizzling是改變一個selector的實際實現的