理解C/C++运行时库
一、什么是運行時庫
運行時庫(Runtime library)通俗的說就是我們的程序運行的時候所依賴的庫文件,在Windows平臺這些庫由微軟提供,并且是以2種形式提供:靜態(tài)庫(lib)、動態(tài)庫(lib+dll)。每個庫還都提供debug、release 2個版本。
C/C++運行時庫從形式上來講和我們自己開發(fā)的靜態(tài)庫、動態(tài)庫沒什么兩樣,只是它們由微軟開發(fā)和維護(hù),并提供了一些常用的功能支持(如malloc,free, printf等等),如果我們的程序需要使用這些功能(事實上,只要是C/C++程序就一定會用到運行時庫提供的功能),就要鏈接C/C++運行時庫。我們可以自主選擇是鏈接“靜態(tài)庫”還是“動態(tài)庫”,是鏈接“debug版本”的還是“release版本”的。
二、如何鏈接運行時庫
大家可能注意到我們在平時開發(fā)中從來沒有顯式的來鏈接這些庫,這是為什么了?
因為我們的編譯器為我們提供了便利,我們只需要向編譯器指定特定的編譯選項(如MT、MD、MTd、MDd),編譯器就會自動鏈接對應(yīng)的庫。
同時,編譯器會根據(jù)MT和MD來定義相應(yīng)的預(yù)處理宏:MT 對應(yīng) _MT宏,MD對應(yīng)_MD宏。
例如,我們通過Visual Studio開發(fā)C/C++程序時,在工程屬性中配置“運行庫”為MT、MD、MTd、MDd中的一個:
就相當(dāng)于間接的向編譯器指定編譯選項和定義相應(yīng)的宏。
三、不同版本和形態(tài)的運行時庫
3.1 運行時庫對應(yīng)的文件
下表列出各種編譯選項的含義以及對應(yīng)的庫文件:
| ML | Single-Threaded | Release版的單線程靜態(tài)庫 | libc.lib | 從VS2005起被廢棄 |
| MLd | Single-Threaded Debug | Debug版的單線程靜態(tài)庫 | libcd.lib | 從VS2005起被廢棄 |
| MT | Multi-threaded | Release版的多線程靜態(tài)庫 | libcmt.lib | |
| MTd | Multi-threaded Debug | Debug版的多線程靜態(tài)庫 | libcmtd.lib | |
| MD | Multi-threaded DLL | Release版的多線程動態(tài)庫 | msvcrt.lib + msvcrxxx.dll msvcprt.lib+msvcpxxx.dll | |
| MDd | Multi-threaded DLL Debug | Debug版的多線程動態(tài)庫 | msvcrtd.lib + msvcrxxxd.dll msvcprtd.lib + msvcpxxxd.dll |
如果計算機上安裝了多個版本的VC++運行環(huán)境(或者多個版本的Visual Studio),則相同名稱的lib或dll就會存在多份。如msvcrt.lib文件:
3.2 運行時庫文件命名規(guī)則
msvcr100d.dll為例:
ms = Microsoft v = Visual c = C Program r = Run-time 100 = Version d = Debug (不帶d即為release版本)msvcp100d.dll為例:
ms = Microsoft v = Visual cp = C Plus Plus 即C++ 100 = Version d = Debug (不帶d即為release版本)四、運行時庫使用注意事項
- 不要混合使用運行時庫的靜態(tài)庫版和動態(tài)庫版。
- 不要混合使用運行時庫的debug版和release版。
- 不要混合使用不同版本的運行時庫。
總結(jié)
以上是生活随笔為你收集整理的理解C/C++运行时库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加快Android Studio的编译速
- 下一篇: Windows常用运行库(VC++、Di