问题标签 [msvcrt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
634 浏览

64-bit - 在 Windows 上检测多个链接的 C 运行时

我在 Windows(64 位)上从事的一个项目存在一些问题。程序有时会崩溃,有时不会,我怀疑这个问题与多个链接的 C 运行时有关。如何在 windows 上检测到这个?我尝试使用depends.exe,但它没有报告CRT

0 投票
1 回答
6282 浏览

c++ - 找不到 MSVCP80.dll(并排问题?)

当我尝试从 Visual Studio 2005 (SP1) 启动我的项目的发布版本时,我收到以下错误消息:

“此应用程序无法启动,因为未找到 MSVCP80.dll。重新安装应用程序可能会解决此问题”

当我查看发布版本的清单时,它指定了以下内容:

当我查看 Windows/WinSxS 文件夹时,我有以下版本的 CRT:

所有这些文件夹都包含所需的 dll。在我的固定电脑上,使用完全相同版本的 Visual Studio,一切正常。

这是踢球者,在问题浮出水面之前,我设法在发布和调试中只启动了一次程序。debug-build 的输出显示 WinSxS 中的DebugCRT .762*-dll 是第一次加载的,但现在当我尝试启动程序时,它找不到这些 dll。

唯一的外部依赖是 ws2_32.lib。

我刚刚重新安装了笔记本电脑上的所有内容(Windows XP、Visual Studio、Service Pack 等),但无济于事。

如果我删除对 ws2_32.lib 的引用,程序就会启动。

请帮帮我,我要把我全新的笔记本电脑扔出窗外:(

亲切的问候

安德烈亚斯·布林克

0 投票
2 回答
3117 浏览

qt - 如何在不依赖 MSVCx80.dll 的情况下构建 QTcore4.dll?

我有一个 Windows 屏幕保护程序,我想使用 QT 库重新编译它,以便可以用于更多平台。我在 Vista 和 XP 上的部署遇到了问题。

我用 MT 静态编译我的屏幕保护程序,并运行依赖项检查器。结果是:

MyScreensaver.SCR 需要几个 DLL,QTCORE4.DLL 但不需要 MSVCx80.DLL。到目前为止,这很好。

我的问题是 QTCORE4.DLL 确实需要 MSVCP80.DLL 和 MSVCR80.DLL 因此我的应用程序无法在 Vista 系统上运行。

我可以构建 QTCORE4.DLL 以静态链接微软库(可能是 Libcmt.lib 吗?),这样我在 MS CRT DLL 中没有任何依赖关系?

限制:

在尝试了各个方向的解决方案之后,似乎最可行的方法是使用 QTCore4.dll 和 QTGui4.dll,但将它们静态链接到 MSVCRT。这样,我的程序和 QT DLL 都不会依赖于 MSVCRT dll。

有针对这个的解决方法吗?(我是 QT 编程新手)

谢谢你,迈克尔

0 投票
4 回答
26895 浏览

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

如果某些应用程序的库动态依赖于 msvcrt.dll,我是否应该使用我的应用程序重新分发 msvcrt.dll 并使用私有 dll?即系统的 msvcrt.dll(dll 地狱)是否可能存在任何不兼容问题?应用程序针对 Windows Server 系统。

0 投票
1 回答
1763 浏览

c - 从 cmd.exe 运行时基于 C 的控制台应用程序崩溃,在 VS2008 调试器中运行良好?

不知道这里发生了什么。
我有一个用 C 编写的 Windows 控制台应用程序。当我在 VS2008 中运行它时,它运行良好。如果我从 cmd.exe 提示符运行它,它通常会在 malloc() 中崩溃。我猜这是由于 CRT 库不匹配而导致的竞争条件。

该应用程序很简单。
它调用 WinHttp 层向网站发送 GET 请求,然后吞下回复。那部分似乎工作正常,但是在 WinHttpReadData 之后,程序调用 printf() 将接收到的数据打印出来,这就是 malloc 经常发生崩溃的地方。

但仅限于调试器之外。???

我正在从命令行编译。

如果我用 /MT 编译,我会看到上面的结果,或者什么也没有。如果我使用 /MD 编译,那么它在调试器中运行时挂起,在调用 free() 时会挂起,并且在 cmd.exe 中崩溃(与 /MT 相同)。

一些问题 -

  1. 由于 PATH 在 VS2008 中可用,是否存在不同的行为?

  2. 原因可能是我的机器上没有安装 VC90 运行时?

  3. 我认为通过静态链接 (/MT) 我不需要安装 VC90 运行时?

  4. 我还是不明白 /NODEFAULTLIB。这有关系吗?

我习惯于制作文件和编译器,而且我知道 C。我不知道 C++,这就是我用 C 编写的原因。但我不理解 Windows 上 CRT 的所有变幻莫测。有人能解开这个谜吗?

0 投票
1 回答
1788 浏览

c - 在 Win32 上使用 Gcc 并链接到 msvcrt.dll

我知道微软建议不要链接到 msvcrt.dll,所以请让我远离那个警告。他们一直在他们的软件(如 WinDbg)中这样做,并且他们不会引入重大更改,因为所有 VC6 应用程序都链接到 msvcrt.dll。

链接 msvcrt.dll 有几个好处。小型可执行文件,易于部署:自 win98 以来就有 msvcrt,我不必将几个 MB C 运行时与我的安装程序捆绑在一起。

现在,是否可以使用gcc来链接 msvcrt.dll 中的 C 库而不是 glibc?如果是,如何?

谢谢!

0 投票
1 回答
2657 浏览

python - ctypes中不同版本的msvcrt

在 Windows 中,ctypes.cdll.msvcrt当我导入 ctypes 模块时,该对象自动存在,它根据 docsmsvcrt表示Microsoft C++ 运行时库。

但是,我注意到还有一个find_msvcrt函数"return the filename of the VC runtype library used by Python"

它进一步指出,"If you need to free memory, for example, allocated by an extension module with a call to the free(void *), it is important that you use the function in the same library that allocated the memory."

ctypes.cdll.msvcrt所以我的问题是,我已经拥有的库和我可以使用该函数加载的库之间有什么区别find_msvcrt?在什么特定情况下它们可能不是同一个库?

0 投票
3 回答
32975 浏览

msvcrt - 并排配置错误 (Microsoft.VC80.CRT v8.0.50608.0)

我有一个嵌入了以下清单的程序集:

在我的一台机器上,这个程序集不起作用(程序集无法加载)。在依赖walker中打开它会给我以下错误消息:

相同的程序集在另一台机器上运行良好,并且依赖 walker 没有错误。

据我所知,问题是由于第一台机器缺少某种依赖项(例如 MSVCR 可再发行组件),但是我已经检查过了,Microsoft Visual C++ 2005 Redistributable 在两台机器上都安装得很好。

我该如何弄清楚缺少的依赖项是什么?

我唯一注意到的是工作机器上的 WinSxS 目录有一个附加条目:

0 投票
1 回答
2183 浏览

windows - 使用太多静态链接的 CRT 解决 fls 限制?

通过 LoadLibrary 加载外部 DLL(不受我们控制)时,我们遇到了一个问题,即这些 DLL 中的静态链接 CRT 无法分配光纤本地存储。这类似于mskb 193462,除了这是 FLS 并且只有 128 个。

有什么有用的方法可以解决这个问题吗?CRT 无论如何都使用 GetProcAddress 来查找 FlsAlloc(因为它显然在 XP 中从未存在过),所以它真的需要它吗?

(这是在 Vista 上,其中 FlsAlloc 实际存在;DLL 似乎正在使用 MSVC8)

0 投票
2 回答
1913 浏览

visual-c++ - 如何找出是什么让我的应用程序混合了静态和动态链接的 CRT

很抱歉接下来的长篇文章。

我知道混合使用 Microsoft 提供的静态链接和动态链接的 C 和 C++ 运行时并不是一个好主意。不幸的是,我们在工作中的应用程序已经将它们混合在一起,我们一直在努力解决这个问题。由于各种原因(其中不熟悉 MSI,我们使用的 NSIS 可能不能很好地支持 MSM,缺乏时间和资源),我们决定静态链接 CRT 而不是动态链接。我知道这不是一个好主意的原因,但这是我们现在的选择。


我们的代码主要是标准 C++,并辅以大量其他开源库。

应用程序的结构是:产生静态库的各种模块,它们本身链接在一起以创建各种东西,其中一个可执行文件给我们带来了问题。

在 Release 中,我们使用 /MT 构建所有代码。对于一些开源库,我们使用了预编译的二进制文件,其中一些是使用 /MD 预编译的 dll,这使我们混合了运行时。所以我们自己用 /MT 重新编译了它们,并让它们生成静态库而不是 dll。这种转换不是针对每个库都完成的,所以我们仍然链接一些使用 /MD 的 dll。


现在的结果是,在depends.exe 中,除了一个可执行文件之外,我们所有的东西都不直接依赖于msvcr80.dll 或msvcp80.dll。不直接依赖是指msvcr80.dll不是depends.exe 显示的树根的子级。有时我们确实发现 msvcr80.dll 被其中一个库 dll 拉入,但那是树中更深的一些级别。

我如何找出为什么 msvcr80.dll 在那个讨厌的可执行文件的第一级?是什么使该可执行链接直接指向 msvcr80.dll?

一个原因可能是我们静态链接到使用 /MD 链接的库 A,因此它与 CRT 动态链接。所以库 A 中的代码最终在我们的可执行文件中,因此我们的可执行文件与 msvcr80.dll 链接。但是我如何找出哪个库做到了这一点?


到目前为止我尝试了什么:

  • 在depends.exe中加载静态链接的.lib文件->不起作用,因为depends.exe需要可执行文件或dll而不是静态库
  • 在静态链接的 .lib 文件上使用 dumpbin.exe /DIRECTIVES -> 它们都没有显示 msvcrt80.dll (在调试中,我们尝试将 /MDd 用于所有内容,但它们确实显示了 msvcrt80d.dll,这让我认为方法是很好,它证明所有静态链接的开源库都用 /MT 正确编译)
  • 使用 /VERBOSE:LIB 链接器标志 -> 它表明它确实在引入 msvcrt.lib,这是 msvcr80.dll 的导入库,所以我们遇到了麻烦,但它没有说明它为什么这样做
  • 在 Visual Studio 中使用 /VERBOSE 链接器标志 +:附加依赖项 libcmt.lib + 忽略所有默认库 YES + 忽略特定库:msvcrt.lib 拼命尝试让 msvcrt.lib 消失或看看是谁拉了它。结果把我难住了:

据我了解,libcmt.lib 中的 typinfo.obj 引用了一个符号,在 msvcrt.lib 中搜索它,然后在 ti_inst.obj 中找到它会引发一个错误,它被定义了两次。但这没有意义。如果 libcmt.lib 已经有符号,为什么它最终会在 msvcrt.lib 中搜索它并因此将 msvcr80.dll 带入我的可执行文件中?更一般地说,为什么静态库要在动态导入库中搜索符号?如果我在 Ignore 特定库中有链接器,为什么还要查看 msvcrt.lib?

谢谢你的耐心 :-)。