专栏首页盟主来了如何在vs中链接vc6的运行时库

如何在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的依赖。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2020.2.2日报:IE兼容模式堆栈

    >   urlmon.dll!CPolicyBrowserModeFilter::_EnsureFilterIfNoDataFound    C++     ...

    龙泉寺扫地僧
  • 一点chromium触屏相关堆栈

           chrome.dll!ui::TouchDispositionGestureFilter::CancelTapIfNecessary 行 394 ...

    龙泉寺扫地僧
  • mb加载百度首页,input框不支持拖拽文字的研究

    后来发现原来是js里调用了preventDefaultMethodCallback,是jquey调用的:

    龙泉寺扫地僧
  • Redis对象底层数据结构实现概述

    Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic s...

    kentian
  • [L2]Seq2Seq中Beam Seach贪心算法和维特比算法

    由于在公众号上文本字数太长可能会影响阅读体验,因此过于长的文章,我会使用"[L1]"来进行分段。这系列将介绍Seq2Seq模型中的Beam Search算法。第...

    触摸壹缕阳光
  • HTTP传输数据压缩

    一、基础 1、HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascr...

    郑小超.
  • 【JAVA进阶】HashMap容量的初始化

    HashMap 使用HashMap(int initinalCapacity)初始化;

    用户5640963
  • mongodb踩坑- C:\Program Files\nodejs\node_cache\_logs\2019-01-08T08_49_25_665Z-debug.log

    在mongodb的实际项目里面,有时候重新启动,或者命令操作频繁,会出现一些报错C:\Program Files\nodejs\node_cache\_logs...

    祈澈菇凉
  • Java--通配符类型

    SuperHeroes
  • Kotlin 开发者社区: Kotlin collections (集合类)

    Nicolas Fränkel is a Developer Advocate with 15+ years experience consulting for...

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券