2013-03-09 89 views
2

我需要在我的應用程序中使用一些針對msvcrt.dll編譯的DLL。我已經試過了,好像好像是。我的第一個擔心是對msvcrt.dll有額外的依賴性;我已經包括Visual Studio 10運行時庫,並希望不必添加更多。我知道msvcrt.dll總是在窗口系統文件夾中,但我應該依靠這個嗎?將針對msvcrt.dll編譯的庫鏈接到Visual Studio 10 C++應用程序中

以下是有關庫頁:

http://www.zlatkovic.com/libxml.en.html

我可以下載源代碼並從頭開始編譯,可以這樣做長期的,但現在我想,以確保不會有什麼連接這些庫和使用DLL的問題。

有該網頁上一點,上面寫着:。

「每一個程序編譯使用這些二進制文件必須使用相同的運行時間,除非你喜歡你的應用程序崩潰,請設置您的項目使用MSVCRT.DLL如果您出於某種原因必須使用不同的運行時,那麼您必須自己獲取源代碼並編譯libxml和朋友。「

這就是我所擔心的。它可能看起來是很好的時刻,但我擔憂的時候是出於對具有不同設置其他系統野外會發生什麼事..

回答

3

我知道MSVCRT.DLL總是在窗口系統文件夾,但我應該依靠這個嗎?

是的。 msvcrt.dll由Windows擁有和維護。你可以依靠它存在,你不需要(也不應該)自己分發它。

有在具有針對不同的運行時鏈接版本的DLL沒有問題,只要它們不通過由CRT跨越DLL邊界(它們可具有不同std::vector實現中,例如,使通過這樣的定義的類型從msvcr100.dll鏈接到dll與msvcrt.dll鏈接的dll中的對象可能會導致問題,並且只要您不在一個dll中分配內存,並在另一個dll中釋放它(再次,它們可能會有不同的malloc/free的實現,也許使用不同的堆)

但他們可以共存就好,只要你不要求他們做任何「不合理的」請他們瞭解dll所鏈接的其他 CRT版本。 (我相信幾乎每個程序最終都會依賴於msvcrt.dll,因爲如果沒有其他的東西,那麼它們會鏈接到各種Windows DLL,而這些DLL又會鏈接到msvcrt.dll。因此,如果這種情況不安全,那麼幾乎每個爲Windows編寫的程序都是不安全的)

+0

+1指出所有DLL的最終依賴於msvcrt.dll – 2013-03-09 14:10:14

+0

謝謝,這幾乎涵蓋了我的顧慮。關於內存分配和釋放,是否可以使用庫中包含的函數調用完成?在這種情況下,我從我的應用程序調用:xmlInitParser(),後來分別分配和釋放內存的xmlCleanupParser()。 – Mark 2013-03-09 14:41:40

+0

是的,如果DLL A調用釋放內存的DLL B中定義的函數,那麼內存是由DLL B發佈,所以(假設B是分配它的人),你是免費的。 :)只要它通過這樣的包裝函數完成,你確保相同的DLL將執行這兩個操作 – jalf 2013-03-09 14:46:35

0

通常在您創建或使用的DLL中,它們將依賴msvcrt的編號版本,比如說:msvcrt90.dll或該版本的調試版本:msvcrt90d.dll。或者也許msvcrt100.dll/msvcrt100d.dll。這些DLL包含所謂的C運行時庫的實現。也許你在混淆這個msvcrt.dll和我上面命名的那些?他們是兩個不同的東西。

從我聽說msvcrt.dll是微軟自己的操作系統內部版本。你不必擔心,認爲,縮小你的頭,擺動你的額頭,或者失去對該DLL的睡眠。

在「混合」C運行時庫中,唯一需要注意的事情之一是不從一個版本的CRT分配內存,並使用不同版本的CRT釋放內存。最終涉及從一個堆分配並釋放另一個堆。這很糟糕,CRT會發出抱怨並拋出異常。

如果您在任何特定版本的CRT上依賴部署應用程序,還可以部署安裝CRT的安裝程序。實際上微軟爲這些提供免費下載。例如,如果你編譯你的應用程序時,依賴於CRT的超舊版本(例如不再與Windows一起發佈),當你啓動你的應用程序時,唯一會發生的事情是Windows將拒絕啓動你的應用程序應用程序。它會給你一個神祕的信息,你將不得不穀歌找出。

+0

沒有混淆,我的擔心是關於混合這兩個。我已經使用msvcrt100.dll部署應用程序。感謝您的回答,雖然:-) – Mark 2013-03-09 14:37:47

相關問題