2013-09-28 104 views
0

Visual Studio 2012(及更早版本)能夠編譯C代碼。 Plain C,而不是C++。如果你想避免運行時間的尷尬,這將是一個很好的功能。我想編譯純C的二進制文件,並希望這樣做沒有MSVCRT運行時。在沒有MSVCRT運行時的情況下在Visual Studio 2012中編譯C

添加/TC(編譯爲C)選項後,我希望得到一個僅具有基本依賴項(如kernel32和ntdll)的二進制文件。而是,這是鏈接:

enter image description here

我們想用VS 2012和運行。 GCC編譯器不需要它,所以必須有一種方法來編譯VS中的「簡單」二進制文件。我們不一定需要複雜的字符串函數或日期/時間庫,只需要簡單的代碼。

問題:是否可以在沒有MSVCRT運行時(甚至是C++代碼)的情況下編譯Visual Studio 2012中的C代碼?

編輯:沒有靜態鏈接(/MT

+0

我對VS/Windows不太熟悉,但是'printf','strcmp','memcpy'這樣的東西駐留在哪裏呢?這是我的印象,MSVC運行時有點像Linux上的'libc.so'。 – us2012

+0

爲什麼不用'/ MT'?我認爲它只鏈接你實際使用的東西?所以如果你不使用MSVCRT中的任何東西,它就不會鏈接任何東西。 – user2802841

+0

我不確定,但我認爲'memcpy'也可以在不同的DLL中使用,更多地分佈在Windows電腦上。 – bytecode77

回答

3

正確答案的問題 「?是否有可能編譯在Visual Studio 20XX C代碼沒有MSVCRT運行時(甚至C++代碼)」是使用/ MT選項(Configuration Properties > C/C++ > Code Generation > Runtime Library=Multi-threaded (/MT))。這創建了一個可執行文件,完全不依賴於任何MSVCRTxx。據我所知,就是這樣。它對你想做的任何事情都沒有限制 - 像memcpy這樣的標準C庫函數仍然可以工作。唯一的區別是.EXE文件略大。我一直在使用MSVC6,MSVC2005,MSVC2008和MSVC2013製作和分發純粹ANSI C代碼的EXE文件,而不會出現任何問題。

至於對「沒有靜態鏈接(/ MT)」限定符問題的回答,那麼你不能。

+0

並不完全如此。你可以編譯一個沒有運行時的DLL,並且沒有從VS2005到VS2015的靜態鏈接。需要注意的是,您對未記錄的行爲持謹慎態度,避免非託管C++並堅持使用簡單的非託管C語言。全局靜態功能不會被初始化,您可能需要創建自己的微運行時粘住user32和kernel32 API調用。如果爲使用不同運行時編譯的產品的DLL插件編譯時,這一點尤其重要。有可能僅在kernel32.dll上創建具有依賴性的C++/CLI .Net插件DLL – birdwes

相關問題