2011-03-10 27 views
3

在windows中;有2個選項鍊接到CRT:構建DLL時;我應該鏈接什麼類型的CRT?

  1. 多線程,靜態鏈接
  2. 多線程,動態鏈接

有人可以闡明什麼是這裏最好的做法有些輕?我應該「靜態」鏈接到CRT還是動態鏈接?

如果我做了一個動態鏈接,並且我編寫了一個使用我的DLL +另一個第三方DLL(這是一個靜態鏈接到CRT)的程序,這是一個問題嗎?

+0

通常我會推薦多線程。第三方DLL應該不會造成問題,因爲鏈接器應該只能看到這些DLL的導入LIB。 – 0xC0000022L 2011-03-10 16:20:55

+0

@STATUS我認爲這裏給出了多線程,Q是靜態或動態的。 – 2011-03-10 19:15:17

+0

@David:......這就是爲什麼我的評論的大部分回答了這個問題的原因;) – 0xC0000022L 2011-03-10 19:30:02

回答

4

在應用程序中使用DLL時,這是一件大事。很重要的是 EXE和DLL使用相同的內存分配器。如果你從需要由調用者釋放的DLL函數返回指針或C++對象(如std :: string)。要獲得相同的分配器,所有模塊必須使用CRT的相同實例。如果你使用/ MD編譯來選擇CRT的DLL版本,你只會得到。 它們必須全部使用相同版本的CRT。無論如何,使用/ MT會導致很難診斷內存泄漏,如果幸運的話會導致訪問衝突。

使用/ MT可以更輕鬆地部署您的應用程序,因爲您不必安裝運行時DLL。正如所暗示的,如果你只需要部署一個EXE,這只是安全的。或者當你非常小心地控制你的DLL的公共接口。例如,自動兼容的COM服務器可以鏈接到CRT的靜態版本。自動化有關於交換指針和管理內存的嚴格規則。

+0

@Hans當然,所有理智的開發都涉及到在同一個庫中的分配和釋放(在庫中,我允許可能有多個DLL,或一個EXE和一些DLL)。在這種情況下,您肯定可以連接靜態或動態CRT,並且選擇歸結爲偏好和衛生因素。 – 2011-03-10 19:16:43

+0

@David:你認爲從函數返回一個std :: string是否合理? DLL分配它,EXE釋放它。需要動態CRT。 – 2011-03-10 19:26:01

+0

@David:不,它不。即使在動態鏈接時,錯誤可能會比將一個庫的調試版本與另一個庫的發行版本混合在一起微妙。除此之外,還有'IMalloc'。 – 0xC0000022L 2011-03-10 19:29:10

相關問題