2009-10-17 60 views
9

在Visual Studio 2008中編寫了一個CGI應用程序並在本地對其進行了刪除後,我將其上傳到了Windows Server 2003操作系統,並且該系統很快無法運行。在沒有運行時可再發行組件的情況下運行C++二進制文件(Server2k3,XPSP3)

我猜我需要安裝猥瑣運行時間分配,但看完這個:

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

我想知道如果它更有意義的方面的東西忽略這一邊,只是重新寫應用程序。

我猜Windows Server 2003沒有我需要的MSCRVT版本? Windows Server 2003有嗎?

當涉及到部署胖客戶端時,我想用我的應用程序分發所需的dll。 他們假設我只是包括iostream,sstream,字符串?

如果我添加windows.h,它會發生顯着變化嗎?

補充:

使用/ MT開關建議採取以下

C/C++ - >代碼生成 - >運行時庫 - >多線程(/ MT)

(你可能會需要做一個乾淨的:

建設 - >清潔

,以避免該錯誤消息

「無法將更新的清單保存到文件中」)

臃腫我的應用程序從38k到573k。那就是我所說的重要(想象一下,如果那是你的薪水)。由於此應用程序的許多實例將不斷加載和卸載(需要寶貴的內存和處理器資源),我希望找到更好(更小)的解決方案。

我知道這對於今天的很多情況並不重要,而不是許多開發人員的重點,因此趨勢是.NOT和60MB運行時間,但這是我想要做的。

補充:

去除調試拿到項目進行編譯後:

項目 - >化子性質 - > C/C++ - >預處理器 - >預處理器定義(去掉DEBUG;)

大小減少到300k,並且會運行。

補充: 正如下面克里斯·貝克建議,複製: msvcm90.dll msvcp90.dll MSVCR90.DLL Microsoft.VC90.CRT.manifest 要在應用程序的目錄將提供所需的全部運行。

使用Visual Studio 6已經提出了幾次,但它不支持Vista(或我們假設的Windows 7)。其他不需要運行時分發的解決方案可能是我的MASM,甚至是Basic的。不幸的是,這打破了使用像C++這樣的高級OOP語言的目的。

只要我需要安裝C++可再發行組件,折衷額外是260k。那是可以接受的

+0

是否*什麼*變化顯着?幾乎所有你用VS2008編譯的東西都需要運行時安裝。 – Joe 2009-10-17 01:58:52

+0

無論發生什麼,您都將需要運行時。你的選擇是*你如何包含它。最方便的方法是使用靜態鏈接的版本。那麼你根本不必分發一個單獨的dll。如果沒有,你有50萬種方法來分發DLL。從需要閱讀15頁文檔的超級複雜並行事物,到將其放入應用程序根文件夾中具有正確名稱的文件夾中,這非常易於管理。 – jalf 2009-10-17 10:18:22

+0

我不確定這將是多麼有效,但嘗試擺弄編譯器/鏈接器選項。有一些影響了可執行文件的大小(關於優化大小和刪除未使用的東西)。 – 2009-10-18 08:38:15

回答

6

的選項的更完整列表:

  • 重寫應用程序,以便世界上沒有C/C++使用的。
  • 切換到Visual Studio 6或基於mingw的工具集(如Code :: Blocks) - 它們使用已分發的msvcrt.dll作爲其運行時。
  • 使用/ MT開關構建。這將在exe中建立必要的運行時功能。這會膨脹它。但是,這個膨脹(坦率地說)比加載單獨的DLL的開銷少。
  • 將VS9運行時分配爲'private sxs'安裝。這需要將C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT的內容複製到應用程序的exe文件所在的文件夾中。如果您已應用SP1,那麼此文件夾將包含SP1運行時,但您的應用程序將要求RTM運行時(請參閱圖)。將_BIND_TO_CURRENT_CRT_VERSION添加到您的項目定義,重建,並應該自行排除。
  • 顯然有一個vc_redist.exe可以獲得VS9。找到或找出將上述程序集(即Microsoft.VC90.CRT的內容)實際安裝到共享的sxs存儲中所需的MSI或安裝程序mojo。
+0

分配VS9運行時工作。參見上面的討論 – 2009-10-23 06:17:28

9

讓我修改我的答案是:

您有幾種選擇:

1)安裝VC++ 2008運行庫。你可以download和他們的安裝程序。爲他們合併模塊也是可用的。

2)靜態鏈接到運行時(/ MT或C/C++ - >代碼生成 - >運行時庫:多線程)。這會增加可執行文件的大小,但不會依賴於任何Dll。如果您擔心大小,只能使用C標準庫或直接使用Windows API。

3)使用舊版本的VC++。 2005年和更早版本不需要安裝運行時。 Dll可以放在與可執行文件相同的目錄中。如果您使用VC++ 6.0,運行時將安裝在所有版本的Windows上,否則您需要自行安裝。

+0

我想你的意思是 項目屬性 - > C/C++ - >鱈魚代 - > RUntime庫 - >多線程(/ MT) – 2009-10-17 19:46:10

+0

編碼器或Cod?哈哈..你可能是對的,我試圖從記憶中去做。 – 2009-10-17 22:05:00

相關問題