2012-05-17 22 views
7

是否有可能在C/C++開發的窗口,而不是針對msvcr100.dll鏈接?在C/C++ for windows開發時省略msvcr100.dll?

據我所知,這是Windows的標準C庫,但我想知道如果我沒有安裝Visual Studio或Redistributable軟件包,我的計算機上的所有程序如何運行?

+1

您可以開發針對其他類似於C++的英特爾或GCC的庫,但如果動態鏈接到庫,它不是在運行時可用,你的程序將無法運行。靜態鏈接將起作用。 – birryree

+0

反對哪個庫被Paint等鏈接?或者它們全都與它們使用的c lib靜態鏈接? – Erik

+1

Paint是針對較舊的msvcr開發的,並且默認情況下已將其安裝到窗口中。 – birryree

回答

16

在解決方案資源管理器窗口中的屬性,C/C++,代碼生成,運行時庫設置中右鍵單擊您的項目。將其更改爲/ MTd。重複發佈配置,選擇/ MT

現在您將鏈接CRT的靜態版本,您使用的任何函數都會直接鏈接到您的EXE中,而不是在運行時從msvcr100.dll中獲取它們。所以你不再需要將DLL與你的程序一起部署。

避免,如果你創建自己的DLL使用此選項。然後,重要的是那些DLL和EXE使用完全相同的CRT,這樣它們將共享相同的CRT狀態和相同的堆。因爲如果他們不這樣做,那麼傳遞C++對象或需要從一段代碼釋放到另一段代碼的指針會產生令人討厭的問題。一個AccessViolation,如果你幸運的話,如果你不是內存泄漏。

+0

謝謝!多數民衆贊成在 – Erik

+0

現在令人討厭的錯誤是不太常見,但它仍然是浪費磁盤空間,內存和CPU緩存有20個DLL與CRT的每個副本。 – MSalters

+0

由於某些原因,這並不總是有效。例如,如果您已經編譯了該項目至少一次,則不能像這樣鏈接它。 –

1

在Windows上,我懷疑是否有可能創建一個非平凡的程序,不以某種方式使用CRT。

無需鏈接到msvcrXXX.dll就可以使用CRT - 只需鏈接到靜態庫即可。但是,解決你的問題:

如何在我的電腦上的所有程序可以運行,如果我沒有安裝Visual Studio或再發行組件包?

如果您的PC上的程序鏈接到msvcrtxxx.dll,那麼他們不能。 Sinmply,一個特定的程序所需要的重新編號可能已經安裝在你的PC上,然後你甚至可能會出現。或者至少,該計劃所需的重新組織部分。

2

如果您限制您的項目僅使用C編程語言/庫,那麼您可以從 僅鏈接到MSVCRT.lib,它自Windows XP SP3以來已在任何Windows版本中完全烘焙。

這意味着,而不是依賴於MSVCR100.DLL(或任何其他Visual Studio DLL),您只能鏈接到MSVCRT中的標準C函數。順便說一句,this technique下微軟的傘開發CoApp項目被使用,所以我認爲這是因爲在這種情況下,作爲你一個很好的實踐。

簡單,下載Windows DDK和鏈路只針對$(DDKInstallPath)lib\Crt\$(DDKPlatform)\msvcrt.lib

+1

謝謝。這確實非常有趣,更多的是我期待的。 – Erik

+0

這個庫是一個未記錄的實現細節。儘管許多程序錯誤地依賴於它,但你可以指望微軟在將來支持它。但是這種支持是有限的,例如他們不會將它移植到64位,因爲從來沒有一個64位的VC6。 – MSalters

+0

@ MSalters完全不是這樣。安裝Windows DDK並檢查自己。 DDK確實提供了msvcrt.lib的amd64,i386和ia64版本。 DDK沒死! – mloskot