是否可以在VC++ 10.0中链接VC6的MSVCRT.DLL?
默认情况下,它似乎与MSVCR100.DLL进行连接,但我不想再分发另一个DLL(MSVCRT.DLL已经可以在每一个,我支持OS).
== ==编辑
澄清一下:我的应用程序是一个纯C应用程序,它可以调用WinAPI.我确实理解做C++将需要C++运行时,默认情况下它不捆绑在Windows中(并且最有可能必须匹配编译器).我的问题是关于纯C的使用,以及我目标的最早版本的Windows中存在的CRT功能.
0xC*_*22L 14
(您可以在底部找到执行摘要或TL; DR)
重要提示:这个答案仅涉及官方的Microsoft工具链,而不是像MinGW工具链(基于GCC)这样的链接msvcrt.dll.但我怀疑微软是否会倾向于支持该工具链;)
甚至不要尝试使用Visual C++ 2010来完成任务.
有一个官方和支持的方法:使用独立的WDK,如果您需要您的应用程序链接msvcrt.dll!
您永远不应该尝试使用与CRT标头和库不匹配的编译器工具链.使用Microsoft预期的工具链,而不是您创建的拼凑.不要混搭.使用Microsoft提供给您的内容.但要使用它(并且不要害怕FUD).
可用于链接的最新WDK msvcrt.dll(7600.16385.1)使用cl.exe版本15.00.30729.207.这大致对应于Visual C++ 2008附带的编译器!后来WDK将链接到他们需要的Visual C++版本的CRT .
的msvcrt.dll你会发现,说Windows XP或Windows 7是不是在原来这是包含在Visual C++ 6.0(即使是最新的VC6版)DLL.
在其他答案中也正确地说明了这一点.没有惊喜.
但是,与其他答案所暗示的相比,msvcrt.dll您将在现代系统上找到的内容将允许与原始VC6 CRT相关联的程序继续工作.即使在今天.这是一份合同.并且对msvcrt.dll系统DLL 的推广进一步验证了该合同.
Microsoft内部使用的工具链有点类似于Windows 8 WDK之前提供的WDK.我将专门写下这些并统一使用术语WDK(或独立的WDK),即使在Vista WDK之前它们被称为DDK.
来自OSR的优秀人员,他们似乎可以访问Windows源代码或者那些人,他在几年前参加的一次研讨会上证实,WDK曾经是内部用于构建Windows的工具链的精简版本.时间(〜2005年).类似的提示可以从MSFT自己的Larry Osterman和Alex Ionescu的早期作品中找到tinykrnl,最近版本的"Windows Internals"的合着者.BCZ可能暗示build -cZ,这是我在这里描述的WDK的常用调用.
在这种情况下它很有趣的原因是:所有独立的WDK都允许您创建msvcrt.dll默认链接的可执行文件.对于独立WDKs msvcrt.dll是在 CRT,就像为Visual C++ 2010这msvcr100.dll.
还应注意,工具链与Visual Studio工具链一起更新.例如,在3790.1830 WDK cl.exe报告中与Visual C++ 2003大致相同:
C:\WINDDK\3790.1830\bin\x86>cl /version
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.4035 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
Run Code Online (Sandbox Code Playgroud)
对于6001.18002 WDK(最新支持Windows 2000!)与Visual C++ 2005大致相同:
C:\WINDDK\6001.18002\bin\x86\x86>cl/version
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.278 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
Run Code Online (Sandbox Code Playgroud)
对于7600.16385.1 WDK,它与Visual C++ 2008相当.
独立的WDK从XP版本开始直到(包括)Windows 7 SP1的WDK版本不需要Visual Studio.他们带着自己的工具链.
Windows XP之前的版本需要Visual C++来构建任何东西.如果我没记错VC6的Windows 2000 DDK.
从Windows 8 WDK开始的版本需要再次使用Visual C++并且比以前更紧密地集成(包括向导甚至扩展以进行调试和一些特定于驱动程序的任务).这也是为什么当您使用相应的WDK时,它们将链接到相应工具链的CRT.
在独立的WDK期间,并没有闻所未闻 - 这就是DDKWizard和VisualDDK的原因- 人们尝试使用Visual Studio来包装WDK构建过程.有些人甚至使用了不支持的,微软推荐的方法对并建立了自己的驱动程序与Visual Studio工具链.那些不受支持的方法大致相当于你正在尝试的方法.所以不要.
总之,使用WDK的构建过程build.exe与sources和makefile等繁琐和限制.例如,要从当前目录或其父目录之外的任何源文件构建,您必须编写自己的NMake规则.毕竟build.exe是围绕基于NMake的构建的包装器.您的本地makefile.inc将被WDK/DDK提供的全局包含在内.
msvcrt.dll被正式支持如前所述,msvcrt.dll独立的WDK支持链接.
这也很好.实际上,文件中的USE_MSVCRT=1语句sources具有完全相同的效果.看到这里.引自7600.16385.1 WDK文档:
USE_MSVCRT使用
USE_MSVCRT宏指示Build实用程序在DLL中使用多线程运行时库进行构建.句法
USE_MSVCRT = 1[...]
注意 你永远不应该列出
Msvcrt.lib或Msvcrtd.lib在TARGETLIBS.但是,你可以列出Ntdll.lib在TARGETLIBS.
为什么微软甚至会提供这条路径,如果它们不支持它?正确,他们不会!
事实上,WDK(XP..7 SP1)已经将系统DLL msvcrt.dll用作CRT.
主要有一个警告.随着时间的推移,SEH的实现方式随着更新的Visual C++版本而发生了变化.由于独立WDK的工具链与特定的Visual C++版本紧密对应,因此它们继承了相应的SEH处理.
例如,当您使用Windows 7 SP1 WDK以Windows 7为目标时USE_MSVCRT=1,它会静态导入_except_handler4_common.例如,该功能在Windows Server 2003上不可用.因此,尝试在目标版本之前在Windows版本上运行此类应用程序可能会失败.因此,在这种情况下,您冒险进入"不受支持的领域",所有免责声明均适用.但是,你必须使用方法的选择这里概述,即链接到msvcrt_win2000.obj,msvcrt_winxp.obj并msvcrt_win2003.obj(在Vista和7个WDKs可用)来实现你的愿望(二进制)向后兼容的水平.
好吧,另一方面,如果您决定设置,WINVER=0x0601您也不应该惊讶地发现生成的可执行文件从kernel32.dll(或其他系统DLL)导入函数,这些函数在Windows XP上不可用.那么为什么期望不同的语义msvcrt.dll呢?
另外注意:即使是已检查的版本(通常被认为对应于调试版本)也会链接msvcrt.dll,而不是其调试版本的版本!因为"检查"是指留下断言的事实; 它没有涉及CRT的特定配置,例如"发布"或"调试".假设msvcrt.dll在独立的WDK中调试构建不可用意味着它不知道那些WDK 的 C运行时是简单而简单的误解了检查构建意味着什么.
还有一个小问题.如果您使用Windows 7 WDK来实现链接msvcrt.dll,则您使用的工具链不知道自 Windows 7 以来的发展.这包括导入库,还包括标题.所以不要指望它支持发布时不可用的功能.
msvcrt.dllmsvcrt.dll几年前被提升为系统DLL的状态,这意味着它与系统一起包含(并且可以依赖于字面意思),而不像其他Visual C++ CRT,您需要为其安装相应的可再发行组件包.这也是Raymond Chen在另一个答案中引用的博客文章的要点.
由于独立的WDK(XP..7 SP1)默认链接msvcrt.dll为CRT,因此没有针对它的客观论据.当然意见各不相同.
不幸的是这个答案已经改变了很多,因为我第一次发表了评论,延续FUD并试图拉据称从权威渠道断章取义的.它还链接到原始(MSFT)源 - 经过仔细检查 - 不支持它们所链接的支持的语句.
几年前,微软的Raymond Chen就此发表了博客.在他的博客中,Windows不是Microsoft Visual C/C++运行时传递通道:
一个与所有版本的Visual C++兼容的DLL是一个维护噩梦......在某些时候,决定放弃并声明它是一个操作系统DLL,只能由操作系统组件使用.
强调我的.再想一想,你真的在写一些Windows附带的东西吗?是否难以将支持的文件添加到安装程序或链接静态版本的CRT,而不是依赖于Microsoft 在十多年前放弃编译器兼容性的系统组件?
好的,所以2010年2月是十多年前(这个答案写的时间是2016年3月)?因为这是7600.16385.1 WDK的发布日期,它正式支持链接msvcrt.dll.
Raymond的其他陈述可能与微软最初的意图相符,但他甚至承认他们放弃了这一点并将其提升为系统DLL.
另外,将真正古老的历史(Windows 9x)与支持使用独立WDK(甚至不支持Windows 9x)的建议混合在一起是非常不诚实的.Raymond描述的历史背景是前W2K和非NT.我上面描述的背景是指Windows的NT版本,我只知道实践中的独立DDK/WDK(和更新版本),所以我不知道它是如何或应该在此之前.
所有这一切说:他的博客是不是与混淆官方文档从微软,虽然很多的宝石都可以在他的博客中找到,我已经多年的忠实读者.
虽然这是十多年前的事了,但msvcrt.dllWindows 2000(SP4)中的版本信息却表示:
Description: Microsoft (R) C Runtime Library
Product: Microsoft (R) Visual C++
Prod version: 6.10.9844.0
File version: 6.10.9844.0
Run Code Online (Sandbox Code Playgroud)
......与雷蒙德的介绍性陈述相反.
只有使用Windows XP才能将其更改为:
Description: Windows NT CRT DLL
Product: Microsoft« Windows« Operating System
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,有多少人仍在否认这一决定.
在之前的一些评论之后,假设这是针对我的,这是公平的.
好吧,我并不否认Windows 8 WDK发布的决定.但是,这并没有"取消"正式支持链接的独立WDK,msvcrt.dll也没有"无法"在各自的官方文档中找到它们.
嘿,如果你处于奢侈的位置只需支持Windows 7或8及更新版本,或者其他类似的东西,那对我来说很酷.但是,我必须支持早期的Windows版本,因此我将充分利用Microsoft为这些Windows版本提供的官方工具.是Visual C++ 2005与适当的SDK集成或是一个独立的WDK.
那些人为Visual C++产品团队带来了"很多悲痛"
本声明引用了Raymond Chen的上述博客文章,但将Raymond的陈述脱离了背景,特别是出于时间背景.悲伤是由于人们大致尝试了提问者想要做的事情而引起的 - 更糟糕的是:进入内心/内部msvcrt.dll.这是W2K之前的事情.这是不是(并且不会)因使用像微软的独立WDKs的官方工具链.
现有版本的Windows中的msvcrt版本从未在相应版本的Windows SDK中提及过.
虽然现代应该是合格的,但使用"Windows SDK"表明它是指从"Platform SDK"重命名后的所有Windows SDK.我倾向于相信这一点.但是海报忽略了独立的Windows WDK(以及之前的DDK),它不仅提到它,还msvcrt.dll用作CRT.它们是 Microsoft的官方工具链,旨在进行内核和用户模式开发.
Microsoft使用当前可能公开或不公开的工具链更新CRT DLL(例如,在发布Windows Media Player修补程序时).
那是对的.msvcrt.dll不断更新,因为它已被提升为系统DLL.这就是使用WDK时可以依赖的合同.他们不会破坏使用自己的工具链构建的应用程序,只是因为它们正在修补msvcrt.dll.
您可以指望它们不使用古老的WDK编译器和库来构建Windows中的msvcrt DLL
我甚至都不确定,但2010年的官方工具链并不是我称之为古代的工具.此外,由于微软同时放弃了对XP和2003的支持,他们只需要支持Vista及其后续版本.使用最新的Visual C++版本可以更轻松,它直接为从Windows 8开始的WDK 提供编译器和工具.
(为什么古老?因为WDK团队不喜欢人们使用他们的编译器链接msvcrt,并删除版本8.0中的漏洞来阻止那些"聪明"的人).
哦,真的,不多伦实际上说的是,在所链接的论坛帖子?好吧,不,
win7 wdk build已成功部署,因为您链接了Windows CRT(msvcrt.dll).我们不希望第三方这样做 了,所以我们移除了win8的WDK这种能力.它仍适用于向后兼容.虽然它可以成功部署,但可能会有一些徽标检查,以确保您使用正确的CRT
(强调我的)
该声明是关于微软改变立场的"政治决定"(也是官方的决定).实际上,"不再"意味着这只会随着Windows 8 WDK而改变.第一个与Visual C++集成的现代WDK(自Windows 2000 DDK以来).因此,由于WDK已从独立工具链降级为与给定Visual C++版本集成的扩展,因此新要求完全不足为奇.
顺便提一下,基于Windows 8 WDK和更新版本的争论也是不诚实的,因为关于独立WDK的建议,即msvcrt.dll用作CRT的,在该政策变更之前.将导致msvcrt.dll系统DLL 升级的历史与升级后的时代混合在一起也是不诚实的.
与此答案相反,使用微软自己的未更改的工具链是完全没问题的,例如独立的WDK,它支持msvcrt.dll"本机" 链接(XP..7 SP1).它甚至记录在这些工具链附带的文档中(除非您决定不安装它或闭上眼睛:)).
您"只" 必须确保在构建时定位正确的Windows版本(基本上与定义正确的版本相同WINVER).但是对于其他系统DLL(例如kernel32.dll,user32.dll......)也可以这样说.
但是,自2002年以来使用任何 Visual C++进行链接msvcrt.dll 都必然会造成麻烦.不要混搭.只需使用与特定Visual C++版本匹配的CRT即可.
Tao*_*Yue 10
它不是VC6运行时.它是MSVCRT.DLL的系统副本,它与Windows而不是Visual Studio捆绑在一起.每个新版本的Windows都会获得新版本的MSVCRT.DLL,您可以通过检查文件大小来查看.
您可以使用Windows驱动程序工具包编译MSVCRT.DLL的系统副本.请注意,此DLL仅供"仅由系统级组件使用".什么是系统级组件?好吧,一个司机.或者,例如,文本服务:
http://blogs.msdn.com/b/tsfaware/archive/2008/01/17/visual-studio-2008-issues.aspx
如果您正在构建文本服务DLL ...我建议安装Vista(或XP)DDK并使用DDKWizard.DDK附带了自己的C/C++编译器,该编译器使用OS附带的C运行时库(并且不会导致其他应用程序出现问题)......
更多信息:
http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/
出现了一个问题,微软做了什么?他们将应用程序部署到各种Windows环境中.看看Windbg的依赖关系表明它使用的是MSVCRT.DLL,而不是其中一个较新的CRT.微软的新网络监视器3.1也使用MSVCRT.DLL.Windows桌面搜索也使用旧的,可靠的CRT.
所有这些新应用程序如何使用老式CRT?他们还没有使用古老的,不受支持的Visual C++ 6.0,是吗?好吧,不.答案更复杂,可以在Windows驱动程序工具包(WDK)中找到.
更新:Windows 8驱动程序工具包引入了一个新的基于MSBuild的构建系统,该系统不再链接到MSVCRT.DLL的系统副本.但是,使用Windows 7驱动程序工具包构建的二进制文件仍可在Windows 8和Windows 10上运行.
MSVCRT.DLL仍然随Windows 10一起提供,以实现向后兼容性,因此它的文件版本为7.0.#####.仍在积极开发的组件(如user32.dll)的文件版本为10.0.#####.
平均"Petzold风格"的Win32程序只需要msvcrt.dll中的一些功能.在我的例子中,我经常需要浮点格式化例程,如_sntprintf().并且这些功能的功能不太可能发生变化.出于这个原因,我创建了一个"msvcrt-light.lib"导入库,作为我在MSVC项目中包含的标准库的替代品.(http://www.tu-chemnitz.de/~heha/hs/msvcrt-light.zip/)
对于成熟的C++程序,msvcrt-light.lib可能根本不适合.如上所述使用DDK.
| 归档时间: |
|
| 查看次数: |
10867 次 |
| 最近记录: |