Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315317
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-09-14 15:25:22

版本: VS 2008(Team)

缘由: 习惯于在自己写的Vim插件中写试验性的小代码片段, 可以一键编译+链接+运行+显示结果于Vim窗口中, 同时可使用VC, GCC编译器, 方便地用pc-lint检查代码. 但在笔记本上如何避免安装一个庞大的Visual Studio, 目的只是以命令行方式使用其VC编译器?

搜索的结果表明, 一些人希望做自定制的build过程时, 也希望能达到这一效果, 微软员工的一个blog中(http://blogs.msdn.com/nikolad/archive/2005/02/09/370299.aspx)说微软对这种用法不提供官方支持, 但借着分析cl.exe依次所要使用的DLL和编译器的工作原理, 可以收集到相关的文件, 最终形成一个可以直接copy过去直接使用的VC 编译环境. 只支持命令行, 没有IDE.

在虚拟机上实验这一过程通过, 但也碰到几个棘手的问题:
假设VS的安装目录是 %VS_Inst%,  典型的是 C:\Program Files\Microsoft Visual Studio 9.0

0. 找一台成功安装了VS的电脑, 不一定要是Team版, 免费下载的Express很可能同样可以, 但可能就不能用/analyze 这样的选项了. 要复制的文件全部来源于这台电脑.

1. %VS_Inst%\VC\bin 这个目录一定要复制, cl.exe 就在该目录下, 上面提及的blog及一个名为(How I made new Microsoft C++ compiler work without Visual Studio installation
)的博文中, 甚至剥离出必需的文件列表: c1.dll, c1xx.dll, c2.dll, cl.exe, link.exe  但实际上, lib.exe也是很经常会需要的, 考虑到整个bin目录很小(12M), 我的策略是一古脑全部复制

2. 整个编译器工具键键运行时, 需要VC运行时库, msvcr90.dll 是最重要的一个, 熟悉VC的目录结构后, 很容易会考虑直接从 %VS_Inst%\vc\redist\x86\Microsoft.VC90.CRT\ 这个目录下复制以下4个文件到第1步中的bin 目标目录中:
Microsoft.VC90.CRT.manifest
msvcm90.dll
msvcp90.dll
msvcr90.dll
这4个文件也是该目录下仅有的4个文件

想当然的这个步骤, 却会造成最终的cl.exe 不能运行, 很难查找原因, 用depends walk观察其运行时, 会得到
Side by side configuration informat for xxx not correct 之类的消息, 再进一步的信息就没有.

原因是查看这个 msvcr90.dll 的版本时, 发现与 cl.exe 对这个DLL的版本要求不一致. 当然, mspdb80.dll 对该文件的要求跟cl.exe 是一致的, 使用ultraedit / hex/ 或 cygwin 的strings cl.exe, 查找 manifest字样, 可以找到对msvcr90.dll 这个文件的版本要求信息, 在我的例子中, cl.exe要求的是
9.0.21022.8
这个版本, 而刚才的 redist 下的版本却是 9.00.30729.1
所以要用 WinSxS 目录下的相应版本, 在我的例子, 是
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375\
这个目录下, 有以下3个文件:
msvcr90.dll
msvcp90.dll
msvcm90.dll
与上面相比, 少了 Microsoft.VC90.CRT.manifest 这个文件, 该文件在
C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest
把它复制到要移植的VC的目标目录bin下并更名为Microsoft.VC90.CRT.manifest, 之所以必需用这个名字是因为在exe或dll已经写死了该文件名.

以上这4个文件整个过程的主要难题

3. 除了VC运行时库, 另外几个位于  %VS_Inst%\Common7\IDE 目录下的文件也是必需的:
msobj80.dll
mspdb80.dll
mspdbcore.dll
mspdbsrv.exe

把这4个文件, 也复制到目录目录的bin下, 这个IDE目录的必要性, 通过vcvars32.bat 也可以知道, 它会被加到PATH环境变量中.

4. 复制必要的Include 文件, Lib文件
原以为只要 %VS_Inst%\VC\Include 和 %VS_Inst%\VC\Lib 两个目录即可, 实际上, 象windows.h这样常用的头文件却位于
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\
而象 kernel32.lib, user32.lib, gdi32.lib 这样重要的三大件却是位于 
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\
这个SDK目录也是VS安装过程中放上去的, 这两个目录容量可不小, 280M, 但向Include目录中看进去, 才发现有下面几个文件混迹其内占去了大部分空间:
CStandard.PS
CStandard.IAB
CStandard.IMB
CStandard.PRI
类似地, Lib目录下有个x64的子目录, 放的是与x86平台下每个文件的等价之物, 这再者都去掉后, 一共得到两个include目录, 两个lib目录, 一个bin目录, 全部用zip压缩, 大小是106M, 这就是我得到的最终可复制到其它电脑上使用的VC++编译器. 

如有需要, 可加上MFC相关的include/lib.
如无需要, 可以去掉上面的include/lib 目录中大部分内容. 自裁大小.
阅读(5717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~