首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在vs中链接vc6的运行时库

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

作者头像
龙泉寺扫地僧
发布2019-02-20 15:01:00
1.6K0
发布2019-02-20 15:01:00
举报
文章被收录于专栏:盟主来了盟主来了

是这样,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的依赖。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年07月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指定VS2005,VS2008动态链接到MSVCRT.DLL
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档