日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复杂的C运行时库

發(fā)布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复杂的C运行时库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

復雜的C運行時庫

Posted on?2012-09-27 23:06?justin_s?閱讀(294) 評論(0)?編輯?收藏?

http://www.cnblogs.com/justin_s/archive/2012/09/27/2706409.html

因為各種原因常加一些第三方庫到工程中。使用這些庫,最好能夠自己編譯,否則應該真的應該好好檢查一下它對C運行時庫的依賴情況,否則真的容易出現(xiàn)莫名其名的訪存錯誤。

總結一下,要檢查以下幾個方面:

1. 要檢查一下依賴的C runtime lib是debug或release版,不要混用二者。

2. 檢查C runtime lib是單線程版、靜態(tài)多線程還是動態(tài)鏈版。

?

我們先看CRTLib (C運行庫):

msdn 上有這樣一段話:

警告?不要混合使用運行時庫的靜態(tài)版本和動態(tài)版本。在一個進程中有多個運行時庫副本會導致問題,因為副本中的靜態(tài)數(shù)據(jù)不與其他副本共享。鏈接器禁止在 .exe 文件內部既使用靜態(tài)版本又使用動態(tài)版本鏈接,但您仍可以使用運行時庫的兩個(或更多)副本。例如,當與用動態(tài) (DLL) 版本的運行時庫鏈接的 .exe 文件一起使用時,用靜態(tài)(非 DLL)版本的運行時庫鏈接的動態(tài)鏈接庫可能導致問題。(還應該避免在一個進程中混合使用這些庫的調試版本和非調試版本)。

還有這樣一張表:

Reusable Library??????????????? Switch??? Library??? Macro(s) Defined
----------------------------------------------------------------
Single Threaded???????????????????? /ML?????? LIBC?????????????? (none)
Static MultiThread????????????????? /MT?????? LIBCMT???????? _MT
Dynamic Link (DLL)????????????? /MD?????? MSVCRT??????? _MT and _DLL
Debug Single Threaded?????????? /MLd????? LIBCD????????? _DEBUG
Debug Static MultiThread??????? /MTd????? LIBCMTD??? _DEBUG and _MT
Debug Dynamic Link (DLL)??? /MDd????? MSVCRTD??? _DEBUG, _MT, and _DLL

?

這張表列出了Windows下有六種類型CRTLib(C運行庫),它們是使用不同的switch生成的,這些switch通過宏起作用。

其中MT和MD都適用于多線程,其區(qū)別是:
1. MT為靜態(tài)鏈接CRT,這樣編譯出來exe是自包含的,所以會相對大一些,但運行時不用再load CRT庫。
2. MD為動態(tài)鏈接CRT,編譯出來exe會小一些,運行時需要load CRT,性能有一點點損失。

任何工程都應該使用同樣的CRT Library。即要么都是/ML,要么都是/MTD, 如此類推。 如果一個程序中混合使用不同類型的CRT,有時可以通過link,這樣會存在不同CRT的copy,并會導致內存,比如:
1. 在一個lib中new出來內存,在另一個lib中delete,會crash。
2. 不能在多個lib中共享file handle,理由同上。
3. 一個lib中設置locale(本地化有關),不能在另一個lib中起作用。

?

其實對于Standard C++ Library也有類似的問題,我們這里同樣列出一張表:

當鏈接程序時,一個C運行庫會根據(jù)switch與你的程序鏈接,這是默認行為;但是如果你包含了C++標準頭文件,比如<ios>那么Standard C++ Library會被鏈接進來。

?

msvcrt.dll 與 msvcr71.dll

還有一個比較常見的dll叫msvcr71.dll,將之與msvcrt.dll放在一起說。msvcrt.dll 是系統(tǒng)的一部分,它是為將來系統(tǒng)級組件預留的。我們的程序應該使用、發(fā)布的是msvcr71.dll,而且當發(fā)布時,最好把這個dll放在程序的目錄下而非替換系統(tǒng)目錄下的同名dll.

目前而言,這兩個dll還是比較混亂的,如果你手上有個比較老的庫依賴mscvrt.lib,那么其中依賴的dll可能是mscrt.dll,而如果你重新編譯這個庫的話會發(fā)現(xiàn)c運行庫的依賴變成了mscrt71.dll。而把mscrt.dll和mscrt71.dll混用也是很不好的,同樣可能出現(xiàn)我們上而引用的msdn那段話中講的問題。

?

所以現(xiàn)在我在選擇第三方庫時會比較注意盡量選擇開源的庫;如果需要加入其他人編譯的庫,也會用比如dependence walker這樣的工具先檢查一下對C運行時的依賴情況。

推而廣之一下,其實不僅C運行時庫了,如果兩個第三方庫共同依賴了另外一個庫,那么這個庫的版本也應該被檢查。

?

博客園上也還有不少文章與本文講述的內容相近,比如以下兩篇:

1.?http://www.cnblogs.com/diyunpeng/archive/2011/06/16/2083085.html

2.?http://www.cnblogs.com/Frodo/archive/2008/02/04/1064267.html

總結

以上是生活随笔為你收集整理的复杂的C运行时库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。