如何在vs中链接vc6的运行时库

是这样,vc6的运行时库有个巨大的好处,就是全系列windows都自带了,而且不用管傻逼的manifest问题。

下面找到两篇文章讲解如何做到:


cibech.blogspot.com/2010/02/vs2005vs2008msvcrtdll.html

https://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

http://stackoverflow.com/questions/10166412/how-to-link-against-msvcrt-dll-instead-of-msvcr100-dll-in-vc-10-0


由于翻墙问题,转载一下

指定VS2005,VS2008动态链接到MSVCRT.DLL

自从VC6之后,MS发布的Visual Studio都会发布一个自己的C运行库,比如msvcrt70.dll, msvcrt7.dll, msvcrt80.dll. msvcrt90.dll等等,在默认的链接设置下,程序会动态链接到这些新的C运行库,而非VC6时代的OS CRT库msvcrt.dll,所以有时就会碰到用Visual Studio编译的项目在其他机器上由于缺乏C运行库而无法运行的问题,最常见的就是报0xc0000034错误,提示程序无法正常初始化。

当然,你也可以选择静态链接到新的C运行库,这样可以省去很多麻烦,当然也会增大最终程序的体积,同样也不怎么灵活,想想gdiplus.dll出现过的问题,你不能保证它们不会在这些新的C运行库里出现。另外的一种方案是坚持动态链接到这些新的 C运行库,同时给用户提供一个新的C运行库的版本,这个微软已经为你做好了,他们叫做Microsoft Visual C++ Redistributable Package,根据Visual Studio的版本提供相应的安装包即可,至于为啥不直接放一个新的C运行库到程序的目录里,那得要问微软的SxS机制。

不过抛开Window XP,在Window Vista里已经默认有msvcrt70.dll, msvcrt7.dll, msvcrt80.dll这几个版本,而Windows7里也增加了msvcrt90.dll,不过显然,你不能保证你的程序不会在一个没有这些新的C运 行库的操作系统上运行,动态链接到msvcrt.dll的好处很明显,自从Windows 98开始,它就作为系统的DLL常驻了,而且微软并没有抛弃它的打算,如果你分析一下Window的系统程序,从Windows XP到Windows 7,那些svchost.exe, services.exe, winlogon.exe, explorer.exe等等,都是动态链接到这个古老的C运行库,谁知道为啥他们不用新的。有意思的是Visual Studio的IDE用的正是它自己提供的相应的新CRT库。

Visual Studio并没有提供一个可以链接到旧的C运行库的选项,不过利用WinDDK提供的CRT的头文件和库文件,可以达到同样的目的。

WinDDK是MS提供驱动级程序开发的SDK,可以免费下载于 [How to Get the WDK], 这是一个几百M的SDK,不过只需要安装Develop Enveronment即可,并且我们也只需要其中的部分文件,列表如下:

WinDDK
├─inc
│  └─crt 下的所有文件
└─lib
   ├─crt 下的所有文件
  ....
    ──win7
   │  ├─amd64
   │  │      msvcrt_win2003.obj
   │  ├─i386
   │  │      msvcrt_win2000.obj
   │  │      msvcrt_win2003.obj
   │  │      msvcrt_winxp.obj
   │  └─ia64
   │          msvcrt_win2003.obj
   ├─wlh
   │  ├─amd64
   │  │      msvcrt_win2003.obj
   │  ├─i386
   │  │      msvcrt_win2000.obj
   │  │      msvcrt_win2003.obj
   │  │      msvcrt_winxp.obj
   │  └─ia64
   │          msvcrt_win2003.obj
   ├─wnet
   │  ├─amd64
   │  │      msvcrt_win2003.obj
   │  ├─i386
   │  │      msvcrt_win2003.obj
   │  └─ia64
   │          msvcrt_win2003.obj
   └─wxp
       └─i386
               msvcrt_winxp.obj
当然,通过目录结构也能看出来,inc是CRT的头文件,lib是CRT的库文件,如果确定了程序的平台和架构,只需要拷贝相应平台的库文件夹即可。还有非常重要的一点是,微软并没有提供msvcrt.dll的debug版本,所以如果动态链接到msvcrt.dll时,是不能进行Debug调试的,不过如果你使用的是Visual Studio,那么只需要更改Release下的配置即可,Debug可以保留原先的设置,即Debug时用新的CRT库,而Release时用 msvcrt.dll库,当然,前提是你没用到新CRT库的新特性。就绪之后,设置Visual Studio项目的Release属性就简单很多了:

1. 设置C/C++的General选项Additional Include Directories中增加 inc\crt的路径.
2. 设置Linker的General选项Additinal Library Directories中增加 lib\Crt的路径.
3. 设置Linker的General选项Additinal Library Directories中增加lib\wxp\i386 的路径.
4. 设置Linker的Input选项Additional Dependencies中添加msvcrt_winxp.obj

这里是以XP与i386为例,如果目标平台为64位或者是Windows2003, 在第3步中可以选择相应平台的文件夹,其实除了i386和64平台的区别外,WinDDK提供的msvcrt_winxp.obj和 msvcrt_win2003.obj的版本都是一样,所以如果目标平台是i386,无论是Windows的哪个版本,第3,4步可以保持上面的设置。

最终,通过Dependency Walker可以看到程序的依赖结果,并且MAINFEST里也自动消除了对新CRT的依赖。




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值