酒鬼z

我自将心向明月,独卧沙场醉圆缺

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

出处http://blog.chinaunix.net/u/8681/showart_2052087.html

缘由: 习惯于在自己写的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.00. 找一台成功安装了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.manifestmsvcm90.dllmsvcp90.dllmsvcr90.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.dllmsvcp90.dllmsvcm90.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.dllmspdb80.dllmspdbcore.dllmspdbsrv.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.PSCStandard.IABCStandard.IMBCStandard.PRI类似地, Lib目录下有个x64的子目录, 放的是与x86平台下每个文件的等价之物, 这再者都去掉后, 一共得到两个include目录, 两个lib目录, 一个bin目录, 全部用zip压缩, 大小是106M, 这就是我得到的最终可复制到其它电脑上使用的VC++编译器. 如有需要, 可加上MFC相关的include/lib.如无需要, 可以去掉上面的include/lib 目录中大部分内容. 自裁大小.

posted on 2013-12-04 14:28  酒鬼z  阅读(562)  评论(0)    收藏  举报