提取便携版Microsoft Visual C/C++编译器的方法
虽然即使Visual Studio生成工具也必须要安装,但是实际上命令行编译器完全可以独立运行,所以你可以在任何临时位置(比如虚拟机里)安装,然后使用以下批处理脚本提取出来,注意目录、版本号等需要按你的实际情况修改:
@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"
然后在目录里创建env.bat,这个批处理的作用是设置编译器的环境变量,call它就可以完成设置:
@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
最后,使用用下面的c代码,保存为utf-8编码的test_msvc.c,在命令提示符里执行chcp 65001切换到utf-8,执行cl test_msvc.c /link /NODEFAULTLIB msvcrt.lib libvcruntime.lib ucrt.lib kernel32.lib user32.lib && test_msvc.exe编译运行,可测试是否遗漏文件以及ucrt编码是否正确。
#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;
}
根据https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170、https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170,msvc的c runtime被拆成了三部分,上述编译命令是不包含vcruntime140.dll的依赖且生成尺寸最小(其它都动态链接)的最佳途径。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号