标签: msvcrt

解决LNK4098:defaultlib'MSVCRT'与.冲突

这个警告:

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.dllpdh.dll与之相关MSVCRT.dll.显然,我没有这些的调试版本,无法编译它们.

所以我添加/NODEFAULTLIB:MSVCRT到链接器命令行,它实际上删除了警告.但这实际上做了什么?为什么有必要?

dll linker warnings msvcrt visual-studio

198
推荐指数
5
解决办法
16万
查看次数

我应该用/ MD或/ MT编译吗?

在Visual Studio中,有编译标志/ MD和/ MT,可让您选择所需的C运行时库类型.

我理解实现方面的差异,但我仍然不确定使用哪一个.有哪些优点/缺点?

我听说过/ MD的一个优点是,这允许有人更新运行时(比如修补安全问题),我的应用程序将从此更新中受益.虽然对我而言,这几乎看起来像一个非特征:我不希望人们改变我的运行时而不允许我测试新版本!

我很好奇的一些事情:

  • 这会如何影响构建时间?(据推测/ MT有点慢?)
  • 其他含义是什么?
  • 大多数人使用哪一个?

c++ msbuild crt msvcrt visual-studio

117
推荐指数
6
解决办法
8万
查看次数

"此应用程序已请求运行时以不寻常的方式终止它"的原因是什么?

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)

所以我必须弄清楚它实际意味着什么:

  • 终止可视化C运行时库意味着什么?(msvcrt是一个DLL;你不会终止它,你只是不再使用它了)
  • 什么是终止MSVCRT 的常用方法?
  • 有人会选择不寻常的方式终止它吗?
  • 今天是不寻常的方式,实际上是过去常见的方式已被弃用的形式?
  • 如果我(错误地)在一个不寻常的方式终止它,你会怎么做才能终止它在通常的方法是什么?

换句话说:MSVCRT捕获了什么错误,并隐藏在无法提供信息的错误消息后面?

language-agnostic windows msvcrt

59
推荐指数
1
解决办法
8万
查看次数

为什么我的应用程序需要Visual C++ Redistributable包

我正在C++Visual Studio中编写一个简单的应用程序.它还有一个安装项目.它在我的开发机器上运行良好,但是当我在用户的机器上安装此应用程序时,它需要Visual C++ Redistributable Package.我想知道为什么我的申请需要C++ RedistributableC++Windows附带标准运行时库,不是吗?

redistributable msvcrt visual-studio visual-c++ windows-runtime

46
推荐指数
2
解决办法
4万
查看次数

如果尚未安装,如何重新安装vcredist_x86?

在我的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)

inno-setup msvcrt

41
推荐指数
4
解决办法
5万
查看次数

Visual C++可执行文件和缺少MSVCR100d.dll

我知道这已在其他地方被问过并回答了,但我遇到了MS Visual Studio 2010的问题.我开发了一个C++可执行文件,但是如果我在没有VC++运行时库的机器上运行Release版本(即,msvcr100d.dll),我得到"程序无法启动因为你的计算机缺少msvcr100d.dll"错误.

这有点奇怪,原因有两个:

  • 为什么要尝试与可再发行的调试版本链接?
  • 我尝试应用此修复程序,将运行时库设置设置为/ MT而不是/ MD(多线程DLL),但这只会使问题变得更糟(如果我手动复制msvcr100d.dll,则表示无法找到msvcp110 .DLL).

如何将运行时库与我的可执行文件打包在一起,以便我可以在没有安装MS VC 2010或可再发行组件的机器上运行它?

我知道包含DLL副本的安全风险因为它不会被更新,但我的目标只是在短期内将此可执行文件发送给几个朋友.

windows msvcrt visual-studio-2010 visual-c++ msvcr100.dll

36
推荐指数
1
解决办法
12万
查看次数

我应该用我的应用程序重新分发msvcrt.dll吗?

我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)可能出现的任何不兼容问题?应用程序针对Windows Server系统.

windows deployment dll msvcrt

30
推荐指数
4
解决办法
3万
查看次数

msvcrt、ucrt 和 vcruntime 库之间的差异

有人可以解释一下它们之间的区别吗?互联网查询让我很困惑。

我用的是VS2019。

crt msvcrt

29
推荐指数
1
解决办法
3万
查看次数

如何从fopen FILE结构中获取文件HANDLE?

fopen函数返回一个指向FILE结构的指针,该结构应被视为不透明值,而不处理其内容或含义.

在Windows上,C运行时是Windows API的包装器,该fopen函数依赖于该CreateFile函数.该CreateFile函数返回a HANDLE,由其他Windows API使用.

现在,我需要使用使用库的Windows API的内心深处fopenFILE*.那么:有没有办法HANDLEFILE结构中获得?由于这是特定于编译器的,我的意思是在MSVC运行时库上.

据我所知,这将是一个丑陋的,不可移植的黑客,如果微软改变内部格式,可能会破坏FILE......但我正在开发一个封闭的系统(即在Windows CE嵌入式系统上)并重构库将是困难和耗时的.

c winapi crt msvcrt windows-ce

27
推荐指数
3
解决办法
2万
查看次数

Visual Studio 2015运行时依赖项或如何摆脱Universal CRT?

编译了几个.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到货之外,你能推荐我吗?

c++ msvcrt visual-studio-2015

24
推荐指数
3
解决办法
4万
查看次数