这个警告:
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中是一个相当常见的警告.我想了解它的确切原因以及正确的方法(如果有的话)来处理它.
这出现在一个编译的调试版本中/MDd
.该项目与windows之类的东西相关联,Version.dll
并pdh.dll
与之相关MSVCRT.dll
.显然,我没有这些的调试版本,无法编译它们.
所以我添加/NODEFAULTLIB:MSVCRT
到链接器命令行,它实际上删除了警告.但这实际上做了什么?为什么有必要?
在Visual Studio中,有编译标志/ MD和/ MT,可让您选择所需的C运行时库类型.
我理解实现方面的差异,但我仍然不确定使用哪一个.有哪些优点/缺点?
我听说过/ MD的一个优点是,这允许有人更新运行时(比如修补安全问题),我的应用程序将从此更新中受益.虽然对我而言,这几乎看起来像一个非特征:我不希望人们改变我的运行时而不允许我测试新版本!
我很好奇的一些事情:
Visual C运行时抛出一个常见错误:
此应用程序已请求Runtime以不寻常的方式终止它.
有关更多信息,请联系应用程序的支持团队.
这个错误信息实际意味着什么?
让我用一个比喻来解释我正在问的问题.
如果我看到一条消息:
例外:访问冲突(0xc0000005),地址0x702be865
这种访问违规行为与性骚扰无关或有人试图闯入我的计算机(除了一般失败是一个试图阅读我的C驱动器的准将,或者你可能因为执行一次而被拖入监狱的准将Windows 95中的非法操作).
在这种情况下,访问冲突对应于常量EXCEPTION_ACCESS_VIOLATION
(winbase.h
使用值0xC0000005 声明).这个常量可能的异常错误代码可以在EXCEPTION_RECORD
结构中返回.代码ACCESS_VIOLATION
意味着程序试图读取或写入内存中不应该的地址.如果你试图从一个从未分配的内存地址中读取,那么你正在做一些非常糟糕的事情 - 而异常告诉你.
它通常是在程序具有指向内存的指针时引起的,该指针不是或不再有效.解决方案是停止尝试访问无效的内存.
注意:我不是问:
- 程序x为什么会出现C0000005错误?
- 为什么我的代码遭到访问冲突?
- 如何调试访问冲突?
因此,如果我问你,是什么原因导致访问冲突,你不会告诉我检查堆栈跟踪,或观察输出窗口,或发布示例代码.你会说,"这是试图访问无效的内存."
回到我的问题.以下错误意味着什么:
此应用程序已请求Runtime以不寻常的方式终止.
我(相当)确定Microsoft Visual C运行时库没有函数:
void TerminateRuntime(bool UnusualWay);
Run Code Online (Sandbox Code Playgroud)
所以我必须弄清楚它实际意味着什么:
换句话说:MSVCRT捕获了什么错误,并隐藏在无法提供信息的错误消息后面?
我正在C++
Visual Studio中编写一个简单的应用程序.它还有一个安装项目.它在我的开发机器上运行良好,但是当我在用户的机器上安装此应用程序时,它需要Visual C++ Redistributable Package
.我想知道为什么我的申请需要C++ Redistributable
?C++
Windows附带标准运行时库,不是吗?
redistributable msvcrt visual-studio visual-c++ windows-runtime
在我的inno设置RUN选择中,我强制安装MSVCRT.我想知道如果尚未安装它如何安装它自己?
这就是我现在所说的:
Filename: {tmp}\vcredist_x86.exe; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: Installing 2010 RunTime...
Run Code Online (Sandbox Code Playgroud) 我知道这已在其他地方被问过并回答了,但我遇到了MS Visual Studio 2010的问题.我开发了一个C++可执行文件,但是如果我在没有VC++运行时库的机器上运行Release版本(即,msvcr100d.dll),我得到"程序无法启动因为你的计算机缺少msvcr100d.dll"错误.
这有点奇怪,原因有两个:
如何将运行时库与我的可执行文件打包在一起,以便我可以在没有安装MS VC 2010或可再发行组件的机器上运行它?
我知道包含DLL副本的安全风险因为它不会被更新,但我的目标只是在短期内将此可执行文件发送给几个朋友.
我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)可能出现的任何不兼容问题?应用程序针对Windows Server系统.
有人可以解释一下它们之间的区别吗?互联网查询让我很困惑。
我用的是VS2019。
该fopen
函数返回一个指向FILE
结构的指针,该结构应被视为不透明值,而不处理其内容或含义.
在Windows上,C运行时是Windows API的包装器,该fopen
函数依赖于该CreateFile
函数.该CreateFile
函数返回a HANDLE
,由其他Windows API使用.
现在,我需要使用使用库的Windows API的内心深处fopen
和FILE*
.那么:有没有办法HANDLE
从FILE
结构中获得?由于这是特定于编译器的,我的意思是在MSVC运行时库上.
据我所知,这将是一个丑陋的,不可移植的黑客,如果微软改变内部格式,可能会破坏FILE
......但我正在开发一个封闭的系统(即在Windows CE嵌入式系统上)并重构库将是困难和耗时的.
编译了几个.dll使用visual studio 2015,并试图部署在一些旧的Windows 7/64位上.试图猜测应用程序启动和复制MSVCP140.DLL和VCRUNTIME140.DLL需要哪些dll - 但是应用程序无法加载vs2015 dll.开始分析什么是错误的 - 依赖者walker显示来自dll的依赖:
API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
Run Code Online (Sandbox Code Playgroud)
这是特别令人惊讶的,因为我最好的理解CRT负责启动dll/exe,它不提供任何更高级别的服务.
好的,试图弄清楚如何摆脱它们或至少最小化.
找到一篇文章:https: //blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/
它提到了发布静态库 - 所以我认为我可以链接它们并摆脱*L1-1-0.DLL*依赖地狱,但无论我尝试过什么 - 我都没有成功.我试图链接libvcruntime.lib,libucrt.lib,libcmt.lib,尝试禁用链接器选项"/nodefaultlib:vcruntime.lib",甚至尝试添加include目录$(UniversalCRT_IncludePath),并覆盖一些定义的,因为我试图猜测它们是有效的 - 我的尝试都没有帮助.
作为一个中间解决方案,我回归到使用Visual Studio 2013,其中CRT dll只有两个:msvcp120.dll,msvcr120.dll.
当然,您可能会建议安装Visual Studio 2015运行时,但我们的要求之一是支持独立可执行文件 - 无需任何安装即可运行 - 因此现在无法进行额外安装.
除了等待Visual Studio 2017到货之外,你能推荐我吗?
msvcrt ×10
crt ×3
windows ×3
c++ ×2
dll ×2
visual-c++ ×2
c ×1
deployment ×1
inno-setup ×1
linker ×1
msbuild ×1
msvcr100.dll ×1
warnings ×1
winapi ×1
windows-ce ×1