Home > Windows > Visual C++编译环境免安装命令行版

Visual C++编译环境免安装命令行版

November 13th, 2009 li Leave a comment Go to comments

VC的IDE开发环境很好,但太大了,经常是2005/2008/2010装一大堆,占用几十G的空间。用惯了Linux的命令行方式,觉得小巧精致。于是想把VC的基本命令提取出来,也做一个绿色版本。

保留基本的编译命令,cl、lib、link、ml之类的。编译工程只能用nmake了。vcproj工程文件怎么办?用scons重写一个吧。(其实命令行也有个vcbuild)。

制作绿色版之前,首先要安装一个VC,再把其中用到的文件提取出来。或者直接快进到后面找下载链接。


Visual C++ 2008制作要领

VC 2008的最大问题是Visual Studio采用Side-by-Side方式发布,不能简单的把依赖的DLL着全就行了。

1. 复制C:\Program Files\Microsoft Visual Studio  9.0\VC\bin及其子目录1033,到新的vc9\bin目录

2. 在复制VC目录下的lib和include目录,到新的vc9目录下

3. 复制C:\Program Files\Microsoft Visual Studio 2008\Common7\IDE目录下的:msobj80.dll,mspdb80.dll, mspdbcore.dll, mspdbsrv.exe到vc9\bin

4. 在vc\bin生成manifest文件,名为Micrisoft.VC90.CRT.manifest,内容如下

<?xml version="2.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0">
    <noinheritable></noinheritable>
    <assemblyidentity name="Microsoft.VC90.CRT" publickeytoken="1fc8b3b9a1e18e3b" processorarchitecture="x86" version="9.0.21022.8" type="win32"></assemblyidentity>
    <file name="msvcr90.dll"></file>
    <file name="msvcp90.dll"></file>
</assembly>

5. 找到Windows\WinSxS目录下的x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_…目录,复制其中的msvcr90.dll和msvcp90.dll到bin目录

Visual C++ 2010制作要领

VC 2010还在Beta阶段,不过据说已经决定不用SxS,直接用DLL发布了,所以制作简单点。

1-3和2008类似,复制bin, include, lib,复制Common7\IDE目录下的几个dll和exe

4. 到Windows\System32目录下找msvcr100.dll, msvcp100.dll,复制到bin

Windows SDK

VC的lib和include里面不带Windows的头文件和库,所以还需要把Windows SDK摘取出来。Windows SDK在安装的时候一般装在C:\Program Files\Microsoft SDKs\Windows\XX目录下,同样把其中的bin, lib, include目录复制出来,到一个新目录,比如win6sdk。

环境设置

影响C编译器的环境变量就三个,INCLUDE、LIB和PATH。设置好就可以编译了。假定上面我把VC 2008和Windows SDK分别复制到了vc9和win6sdk目录下,在与这两个目录的上级目录中,创建一个BAT脚本,假设叫vc9.bat,包含下面内容:

@echo off
echo Setting environment Visual C++ 2010
 
set VCINSTALLDIR=%~dp0vc9
set WindowsSdkDir=%~dp0win6sdk
 
set INCLUDE=%WindowsSdkDir%\include;%VCINSTALLDIR%\include
set LIB=%WindowsSdkDir%\lib;%VCINSTALLDIR%\lib
set PATH=%FrameworkDir%\%FrameworkVersion%;%WindowsSdkDir%\bin;%VCINSTALLDIR%\bin;%PATH%

再创建一个BAT脚本,叫start-vc9.bat,包含下面一行:

start cmd /K %~dp0vc10.bat

在Windows资源管理器中双击start-vc9.bat就可以配置好环境变量,进入VC 2008的编译环境了。

下载

1. vc10.rar 21M 2010的命令行工具和include/lib打包 下载

需要和3解压到到一起用。双击start-vc10.bat打开一个命令行窗口,就可以用cl, nmake, link等命令了。VC需要的基本环境变量会自动设置。

2. vc9.rar 15M 2008的命令行工具和include/lib打包 下载

需要和3解压到一起用。双击start-vc9.bat打开命令行窗口,VC需要的环境变量会自动设置。

3. win7.rar 16M Windows 7.0 SDK的include/lib打包 下载

注意:命令行编译环境没有包含Debug版的CRT,所有的MFC、ATL的DLL。所以可能存在编译好的程序缺少DLL不能运行的问题。对于2008,可以下载一个VC相关SxS打包。缺DLL就到里面找(参见我的Side-by-Side笔记)。对于2010,由于已经废弃了SxS的发布方式,可以直接到网上下载缺的DLL。

Categories: Windows Tags: , ,
  1. November 16th, 2009 at 10:03 | #1

    关于你移植的GDI++X64项目给你提出一个重要问题.
    我不懂编程,但我是个极细心和高要求的人.所以我还是能帮你很大的忙.

    GDI++的HE和新FT版都是不开源的.
    开源的GDI++版本中我全部在作者的主页中下载并试用了(环境WINDOWS2008 不是XP 放心)
    只有一个老FT版(区别于新FT,它是不带FREETYPE.DLL的) 能够渲染包括开始菜单在内的所有EXPLORER元素和所有程序.我看了下你选用的那个GDI++的版本的配置文件,跟我说的那个老FT版不一样.所以即使你的EZHOOK移植的没问题,你的EZGDI++还是不可能渲染开始菜单和所有程序的.

    而且我说的这个老FT(据文档描述好像是FT的开头第一版?不带FREETYPE.DLL就能实现FREETYPE的平滑效果)渲染粗体的效果比HE和老FT版还优秀N倍.尤其是在MMC控制台里,不会像HE和新FT版的GDI++那样把粗体渲染的失真和花版.

    最重要的是改版比HE和新FT版还要稳定.从没像HE和新FT版那样报过错或者程序因为它崩溃过,实在是神器.这个神器有个不是缺陷的缺陷,不能UNLOADDLL.不过你采用的也不是不能嘛.而且这个版很奇怪.不该HOOK的程序它都不会HOOK,该HOOK的它都HOOK.不会像HE和新FT一样自动HOOK所有GDI32的程序…………TASKLIST /M的模块里显示有它的进程不多,但是所有图形程序基本它都能渲染……….好神器啊……….!!!

    请通过我的邮箱跟我联系,版本号我忘了,在我的网盘里.认识你算我走运.我很需要X64的GDI++.输入法我搞GOOGLE拼音的自定义词库.唯一缺的就是这个GDI++.你的完美绿化VS的文章对我这个追求完美的绿色软件偏执者和刚学C++的菜鸟的学习也是非常有帮助的.
    当然你认识我你也很走运.速联系.

  2. November 16th, 2009 at 10:08 | #2

    看到我的留言了如果你给我发了邮件了请在此页给我个回复.

  3. November 16th, 2009 at 13:30 | #3

    你好,给你回信了。谢谢你的支持。easyhook版本我过一段时间一定会开始继续开发,希望2周内吧。

    X64的版本也是我很希望用到的。目前其实有很大的问题,在于我对easyhook的原理还没有弄的很明白,因为我也是个win32编程菜鸟,但我认为有时间肯定能搞明白。

    你说的情况我都不知道:)因为我用FT版用的很少,平时都是用HE版,也没发现HE版和最新的FT版其实都没有不开源,呵呵。

  4. May 30th, 2010 at 11:06 | #4

    很好哈哈 可是怎么下载啊

  1. August 17th, 2010 at 23:03 | #1
Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).