1.概論
執行時庫是
程式在執行時所需要的庫檔案,通常執行時庫是以
lib或
dll形式提供的。
c執行時庫誕生於
20世紀
70年代,當時的程式世界還很單純,應用程式都是單執行緒的,多工或多執行緒機制在此時還屬於新觀念。所以這個
j時期的
c執行時庫都是單執行緒的。 隨著
作業系統
多執行緒技術的發展,最初的
c執行時庫無法滿足程式的需求,出現了嚴重的問題。
c執行時庫使用了多個全域性變數(例如
errno
)和靜態變數,這可能在多執行緒程式中引起衝突。假設兩個執行緒都同時設定
errno
,其結果是後設定的
errno
會將先前的覆蓋,使用者得不到正確的錯誤資訊。
因此,visual c++
提供了兩種版本的
c執行時庫。乙個版本供單執行緒應用程式呼叫,另乙個版本供多執行緒應用程式呼叫。多執行緒執行時庫與單執行緒執行時庫有兩個重大差別:(1
)類似errno
的全域性變數,每個執行緒單獨設定乙個;
這樣從每個執行緒中可以獲取正確的錯誤資訊。(2
)多執行緒庫中的資料結構以同步機制加以保護。
這樣可以避免訪問時候的衝突。
visual c++
提供的多執行緒執行時庫又分為靜態鏈結庫和動態鏈結庫兩類,而每一類執行時庫又可再分為
debug
版和release
版,因此
visual c++
共提供了
6個執行時庫。如下表: c
執行時庫
庫檔案single thread(static link)
libc.lib
debug single thread(static link)
libcd.lib
multithread(static link)
libcmt.lib
debug multithread(static link)
libcmtd.lib
multithread(dynamic link)
msvert.lib
debug multithread(dynamic link)
msvertd.lib
void maincrtstartup(void)
3.各種c執行時庫的區別(1
)靜態鏈結的單執行緒庫
靜態鏈結的單執行緒庫只能用於單執行緒的應用程式,
c執行時庫的目標**最終被編譯在應用程式的二進位制檔案中。通過
/ml編譯選項可以設定
visual c++
使用靜態鏈結的單執行緒庫。(2
)靜態鏈結的多執行緒庫
靜態鏈結的多執行緒庫的目標**也最終被編譯在應用程式的二進位制檔案中,但是它可以在多執行緒程式中使用。通過
/md編譯選項可以設定
visual c++
使用靜態鏈結的單執行緒庫。(?)(3
)動態鏈結的執行時庫
動態鏈結的執行時庫將所有的
c庫函式儲存在乙個單獨的動態鏈結庫
msvcrtxx.dll
中,msvcrtxx.dll
處理了多執行緒問題。使用
/ml編譯選項可以設定
visual c++
使用動態鏈結的執行時庫。
/mdd
、/mld
或/mtd
選項使用
debug runtime library(
除錯版本的執行時刻函式庫),與
/md、
/ml
或/mt
分別對應。
debug
版本的runtime library
包含了除錯資訊,並採用了一些保護機制以幫助發現錯誤,加強了對錯誤的檢測,因此在執行效能方面比不上
release
版本。下面看乙個未正確使用
c執行時庫的控制台程式:
#include
#include
int main()
catch( cfileexception, e )
end_catch
file.write(str,str.getlength());
file.close();}
nafxcwd.lib(thrdcore.obj) : error lnk2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error lnk2001: unresolved external symbol __beginthreadex
main.exe : fatal error lnk1120: 2 unresolved externals
error executing cl.exe.
發生錯誤的原因在於
visual c++
對控制台程式預設使用單執行緒的靜態鏈結庫,而
mfc中的
cfile
類已暗藏了多執行緒。我們只需要在
visual c++6.0
中依次點選
project->settings->c/c++
選單和選項,在
project options
裡修改編譯選項即可。
我們在"rebuild all"
的時候發生了
link
錯誤:從以上**可知,執行庫在呼叫使用者程式的
main
或winmain
函式之前,進行了一些初始化工作。初始化完成後,接著才呼叫了我們編寫的
main
或winmain
函式。只有這樣,我們的
c語言執行時庫和應用程式才能正常地工作起來。
除了crt0.c外,c
執行時庫中還包含
wcrt0.c
、wincrt0.c
、wwincrt0.c
三個檔案用來提供初始化函式。
wcrt0.c
是crt0.c
的寬字符集版,
wincrt0.c
中包含windows
應用程式的入口函式,而
wwincrt0.c
則是wincrt0.c
的寬字符集版。
visual c++
的執行時庫源**預設情況下不被安裝。如果您想檢視其源**,則需要重灌
visual c++
,並在重灌在時選中安裝執行庫源**選項。
2.c執行時庫的作用
c執行時庫除了給我們提供必要的庫函式呼叫(如
memcpy
、printf
、malloc
等)之外,它提供的另乙個最重要的功能是為應用程式新增啟動函式。
c執行時庫啟動函式的主要功能為進行程式的初始化,對全域性變數進行賦初值,載入使用者程式的入口函式。
不採用寬字符集的控制台程式的入口點為
maincrtstartup(void)
。下面我們以該函式為例來分析執行時庫究竟為我們新增了怎樣的入口程式。這個函式在
crt0.c
C執行時庫
visual studio文件的新主頁是docs.microsoft.com上的visual studio 2017文件。可以在crt library features中找到該主題的最新版本。本主題討論構成c執行時庫的各種.lib檔案及其關聯的編譯器選項和預處理程式指令。c執行時庫 crt c執行時...
VC執行時庫
vc專案屬性 配置屬性 c c 生成 執行時庫 可以採用的方式有 多執行緒 mt 多執行緒除錯 mtd 多執行緒dll md 多執行緒除錯dll mdd 單執行緒 ml 單執行緒除錯 mld reusable library switch library macro s defined single...
VC執行時庫
vc專案屬性 配置屬性 c c 生成 執行時庫 可以採用的方式有 多執行緒 mt 多執行緒除錯 mtd 多執行緒dll md 多執行緒除錯dll mdd 單執行緒 ml 單執行緒除錯 mld reusable library switch library macro s defined single...