10G打造微软全版本编译器大全
百度云盘下载 (后面更新后不另行通知)
最近升级一下VS到2017 发现2017的安装包需要 vs_professional.exe –layout c:\vs2017offline 可以把安装包缓下来
发现如今的VS已经是30多G的大小了, 勾选一下安装感觉小小的C盘开始紧张起来 看来VS越来越肥了
作为C++编译使用 无非就是编译和链接 于是就想起了 nmake和cmake
VC编译文件夹工具说明:
EXE | 说明 |
---|---|
cl.exe | C/C++编译器 |
ml.exe | 汇编编译器 |
nmake.exe | 微软搞定makefile的工具 |
link.exe | 链接器 把cl出来的obj 搞成exe或dll等 |
rc.exe | 应该是资源编译吧 |
lib.exe | 看名字是搞lib哦 |
其他exe 懒得管了 |
于是开始分析 “VS2013 x86 本机工具命令提示” 开始
在VS2013 x86 本机工具命令提示 下cl一下 看看版本
打开电脑上安装的vc2013看下vcvarsall这个文件的内容
到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat
看下内容
其实起作用的基本环境设置是
环境变量 | 说明 |
---|---|
path | //cl等工具运行路径和依赖 |
include | //代码搜索路径 |
lib | //lib搜索路径 |
现在一个exe通常是依赖 wdk crt mfc 等等
我以一个C++写的关机工具SQNativeC64为例,最基本的原生exe通常是依赖 KERNEL32 ,user32,XX32 等等
将这些依赖的XX32.DLL我简略认为 依赖Windows的WDK库
像msvcrtxx的(xx为90 100 ..)我简略认为 依赖crt库
像mfcxxu的(xx为90 100 ..)我简略认为 依赖mfc库
现在分别去找它们的include lib 和src(其实src对编译过程是没用 只不过微软提供让你看里面的实现好分析代码的问题)
我整理后就3个大结构目录
MFC | crt |
---|---|
VC2013\ATLMFC\include VC2013\ATLMFC\lib\x64 VC2013\ATLMFC\lib\x86 VC2013\ATLMFC\src |
VC2013\CRT\include VC2013\CRT\lib\x64 VC2013\CRT\lib\x86 VC2013\CRT\src |
BIN(如下图所示)
这里就没有提取arm的编译器了 留下x64 x86 x86_amd64(这个是用32位cl交叉出64位的程序用的)
然后要确保上面的所有exe是不缺dll的不然后面使用cl时会有直接挂掉的尴尬。
接下来就是提取可怕的WDK 早期叫DDK 微软家族Windows的开发包
用虚拟机的干活 搞起来(虚拟机占很大磁盘 提取完了 看来得删除掉)
分别安装 vc6 vc7 vc2005 vc2008 vc2010 vc2012 vc2013 vc2015 vc2017 补丁全部打好
还有DDK_1830 WDK7.1 WDK8.1 WDK10 这些安装包msdn和百度网上找很多的
在虚拟机的快照中分别提取如下
提取完后的文件夹 这里VCREDIST是crt的dll 上面的cl文件夹的依赖和编译生成的exe依赖就都解决了
到此我就把 VCXX\BIN\vcvarsall.BAT 全部贴出来
cls
@echo off
set VSNUM=2017
set VCNUM=vc15
set DDKNUM=v10.0A
:begin
if "%1" == "" goto x86
if not "%2" == "" goto usage
if /i %1 == x86 goto x86
if /i %1 == amd64 goto amd64
if /i %1 == x64 goto amd64
if /i %1 == x86_amd64 goto x86_amd64
if /i %1 == arm goto arm
GOTO usage
:x86
COLOR E9
SET TMPVALUE=x86&CALL:SETNUM
GOTO x86_x64_arm
:amd64
COLOR 5F
SET TMPVALUE=x64&CALL:SETNUM
GOTO x86_x64_arm
:arm
COLOR 1F
SET TMPVALUE=arm&CALL:SETNUM
GOTO x86_x64_arm
:x86_amd64
COLOR 8F
SET TMPVALUE=x86_amd64&CALL:SETNUM
SET PLATFORM=x86
SET PLATFORMLIB=x64
SET POTHER= (%RUNEX%)
GOTO x86_x64_arm
:SETNUM
REM SET TMPVALUE
SET PLATFORM=%TMPVALUE%
SET PLATFORMLIB=%TMPVALUE%
SET RUNEX=%TMPVALUE%
GOTO EOF
:x86_x64_arm
call:EXTENDPATH
title AGAN Native C++ %VSNUM% %PLATFORMLIB% tools%POTHER%.
SET PATH3RD=%PATH3BIN%
SET PATH3RDINC=%PATH3INC%
SET PATH3RDLIB=%PATH3LIB%
set VCINSTALLDIR=%WORKDIR%VC%VSNUM%
set WINDOWSKITSDIR=%WORKDIR%WindowsKits\%DDKNUM%
set VCREDIST=%WORKDIR%WindowsKits\VCREDIST\%VCNUM%\%PLATFORM%;%WORKDIR%WindowsKits\VCREDIST\D3D\%PLATFORM%;%WORKDIR%WindowsKits\Tools\;%WORKDIR%WindowsKits\Tools\%PLATFORM%
set PATH=C:\Windows\System32;%VCREDIST%;%VCINSTALLDIR%\BIN\%RUNEX%;%VCINSTALLDIR%\BIN\%PLATFORM%;%WINDOWSKITSDIR%\bin\%PLATFORM%;%PATH3RD%;
set INCLUDE=%VCINSTALLDIR%\crt\INCLUDE;%VCINSTALLDIR%\ATLMFC\INCLUDE;%WINDOWSKITSDIR%\include;%PATH3RDINC%
set LIB=%VCINSTALLDIR%\crt\LIB\%PLATFORMLIB%;%VCINSTALLDIR%\ATLMFC\LIB\%PLATFORMLIB%;%WINDOWSKITSDIR%\lib\%PLATFORMLIB%;%PATH3RDLIB%
set LIBPATH=%LIB%
GOTO EOF
:EXTENDPATH
if not exist "%~dp0..\..\extend.BAT" (set WORKDIR=%~dp0..\..) else (call "%~dp0..\..\extend.BAT")
GOTO EOF
:usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo where [option] is: x86 ^| amd64 ^| x86_amd64^| arm
echo:
echo For example:
echo %0 x64
GOTO EOF
:EOF
再在VCXX目录 也就是VCXX\BIN\vcvarsall.BAT 中bin的上层建3个快捷
VCxxxx_x86 %comspec% /k ""bin\vcvarsall.bat"" x86
VCxxxx_x64 %comspec% /k ""bin\vcvarsall.bat"" amd64
VCxxxx_x86-amd64 %comspec% /k ""bin\vcvarsall.bat"" x86_amd64
再集成Cmake工具后给每个文件夹整个图标找起来就更快了 成果如下
vc.bat如下所示
@echo off
if "%1" == "" (SET VSNUMBER=2015& goto VCXXSHELL)
if /i %1 == 6 (SET VSNUMBER=6& goto VCXX)
if /i %1 == 7 (SET VSNUMBER=7& goto VCXX)
if /i %1 == 8 (SET VSNUMBER=2005& goto VCXX)
if /i %1 == 9 (SET VSNUMBER=2008& goto VCXX)
if /i %1 == 10 (SET VSNUMBER=2010& goto VCXX)
if /i %1 == 11 (SET VSNUMBER=2012& goto VCXX)
if /i %1 == 12 (SET VSNUMBER=2013& goto VCXX)
if /i %1 == 14 (SET VSNUMBER=2015& goto VCXX)
if /i %1 == 15 (SET VSNUMBER=2017& goto VCXX)
if "%1" == "?" goto HELP
if "%1" == "help" goto HELP
SET VSNUMBER=2015
:VCXXSHELL
cls & call "%~dp0VC%VSNUMBER%\bin\vcvarsall.bat"
COLOR 0A
%comspec% /k
goto end
:VCXX
call "%~dp0VC%VSNUMBER%\bin\vcvarsall.bat"
COLOR 0A
cls & goto end
:HELP
cls
echo 输入如下命令选择编译器版本:
echo vc6 VS vc 6
echo vc7 VS vc 7
echo vc2005 VS vc 8
echo vc2008 VS vc 9
echo vc2010 VS vc 10
echo vc2012 VS vc 11
echo vc2013 VS vc 12
echo vc2015 VS vc 14
echo vc2017 VS vc 141
echo 如vc2013 input:vc 12 or vc64 12
goto end
:end
运行vc.bat
输入 vc 14 就可切换进入vc2015
总文件夹约10G 压缩后1G左右 可根据需要适当精简 WindowsKits
分别测试编译boost sdl2 openssl 7z ogre … (注意有的库在老版本不一定能编 像vc2008前的有的需要很老的代码版本)
随着时间积累 根据自己的实际需要 可以自己扩展集成 如python perl jdk adk delphi …