DEV Community

shajunxing
shajunxing

Posted on

Ways for extracting portable version of Microsoft Visual C/C++ compiler

Although even visual studio build tool must be installed, command line compiler can actually run completely independently, so you can install it in any temporary location (such as in virtual machine), and then use following batch script to extract it, note that directories, version numbers, etc. should be modified according to your actual situation:

@echo off
cd /d %~dp0
robocopy /mir "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.43.34808\bin\Hostx64\x64" "%CD%\vc\bin"
robocopy /mir "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.43.34808\include" "%CD%\vc\include"
robocopy /mir "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.43.34808\lib\x64" "%CD%\vc\lib"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64" "%CD%\win\bin"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared" "%CD%\win\include\shared"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" "%CD%\win\include\ucrt"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64" "%CD%\win\lib\ucrt"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um" "%CD%\win\include\um"
robocopy /mir "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64" "%CD%\win\lib\um"
Enter fullscreen mode Exit fullscreen mode

Then create env.bat in directory. The purpose of this batch file is to set compiler's environment variables. You can do setup by calling it:

@echo off
pushd %~dp0
set PATH=%CD%\vc\bin;%CD%\win\bin;%PATH%
set Include=%CD%\vc\include;%CD%\win\include\shared;%CD%\win\include\ucrt;%CD%\win\include\um;%INCLUDE%
set Lib=%CD%\vc\lib;%CD%\win\lib\ucrt;%CD%\win\lib\um;%LIB%
popd
Enter fullscreen mode Exit fullscreen mode

Finally, use following c code, save as utf-8 encoded test_msvc.c, in command prompt switch to utf-8 by executing chcp 65001, and then compile and run it using cl test_msvc.c /link /NODEFAULTLIB msvcrt.lib libvcruntime.lib ucrt.lib kernel32.lib user32.lib && test_msvc.exe to test if any files are missing and if ucrt encoding is correct.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    puts("Hello, World!");
    puts("你好,世界!");
    int i = 10;
    MessageBox(NULL, "Hello, World!", "Greetings", MB_OK);
    return EXIT_SUCCESS;
}
Enter fullscreen mode Exit fullscreen mode

According to https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170 and https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170, c runtime of msvc has been divided into three parts. Above compilation command is best way to generate smallest size without dependency vcruntime140.dll (all others are dynamically linked).

Top comments (0)