原文:https://www.kechuang.org/t/81211
Visual C++的正統(tǒng)做法是使用DLL版本運行庫。運行庫分發(fā)方法有兩種,一種方法是直接附帶DLL,另一種方法是使用vcredist_x86.exe。
如果不想使用DLL版本運行庫,而是想靜態(tài)編譯的話,可以更改項目屬性,將Release版/MD開關改為/MT,Debug版/MDd開關改為/MTd。但是靜態(tài)編譯有限制,不能跨DLL申請或釋放堆內(nèi)存,也不能使用/clr編譯為托管程序集。
Visual C++ 2015微軟作了一個死,導致在Windows XP/7/8.1等老系統(tǒng)上需要附帶一堆DLL。如果不想附帶這么多DLL,有三種方法:
靜態(tài)編譯
使用vcredist_x86.exe
改用Visual C++ 2013
Visual C++ 2005/2008(以2008為例)
Release版:C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT
Debug版:C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT
以Release為例,一共有四個文件:
Microsoft.VC90.CRT.manifest——并列配置清單文件,必須附帶
msvcr90.dll——C運行庫
msvcp90.dll——C++運行庫
msvcm90.dll——C運行庫托管(.NET)導入庫
其它文件夾還有:
MFC/ATL相關運行庫
Visual C++ 2010/2012/2013(以2012為例)
Release版:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
Debug版:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC110.DebugCRT
以Release為例:
msvcr110.dll——C運行庫
msvcp110.dll——C++運行庫
vccorlib110.dll——應用商店運行庫(VC++2012/2013)
其它文件夾還有:
vcomp110.dll——OpenMP運行庫
vcamp110.dll——C++AMP運行庫(VC++2012/2013)
MFC/ATL相關運行庫
Visual C++ 2015
VC++2015對C/C++運行庫進行了巨大的改造,分成了兩部分:C/C++運行庫和Universal CRT DLLs。在Windows XP/7/8.1上需要第一部分和第二部分,在Windows 10上僅需要第一部分。
C/C++運行庫
Release版:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x86\Microsoft.VC140.CRT
Debug版:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC140.DebugCRT
vcruntime140.dll——C運行庫
msvcp140.dll——C++運行庫
vccorlib140.dll——應用商店運行庫
concrt140.dll——并發(fā)運行庫
其它文件夾還有:
vcomp140.dll——OpenMP運行庫
vcamp140.dll——C++AMP運行庫
MFC/ATL相關運行庫
Universal CRT DLLs(獲取這些DLL需安裝Windows 10 SDK 10586+)
Release版:C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86
Debug版:C:\Program Files (x86)\Windows Kits\10\bin\x86\ucrt
Release版DLL需要全部附帶
Debug版需要使用ucrtbased.dll替換ucrtbase.dll
api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-datetime-l1-1-0.dll
api-ms-win-core-debug-l1-1-0.dll
api-ms-win-core-errorhandling-l1-1-0.dll
api-ms-win-core-file-l1-1-0.dll
api-ms-win-core-file-l1-2-0.dll
api-ms-win-core-file-l2-1-0.dll
api-ms-win-core-handle-l1-1-0.dll
api-ms-win-core-heap-l1-1-0.dll
api-ms-win-core-interlocked-l1-1-0.dll
api-ms-win-core-libraryloader-l1-1-0.dll
api-ms-win-core-localization-l1-2-0.dll
api-ms-win-core-memory-l1-1-0.dll
api-ms-win-core-namedpipe-l1-1-0.dll
api-ms-win-core-processenvironment-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-1.dll
api-ms-win-core-profile-l1-1-0.dll
api-ms-win-core-rtlsupport-l1-1-0.dll
api-ms-win-core-string-l1-1-0.dll
api-ms-win-core-synch-l1-1-0.dll
api-ms-win-core-synch-l1-2-0.dll
api-ms-win-core-sysinfo-l1-1-0.dll
api-ms-win-core-timezone-l1-1-0.dll
api-ms-win-core-util-l1-1-0.dll
api-ms-win-crt-conio-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-filesystem-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-multibyte-l1-1-0.dll
api-ms-win-crt-private-l1-1-0.dll
api-ms-win-crt-process-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-utility-l1-1-0.dll
ucrtbase.dll
VC++6.0的DLL
msvcrt.dll——C運行庫
msvcirt.dll——上古C++使用的iostream運行庫
msvcp60.dll——標準C++運行庫
VC++.NET2002/2003的DLL(以VC++.NET2003為例)
msvcr71.dll——C運行庫
msvcp71.dll——C++運行庫