Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将根据msvcrt.dll编译的libs链接到Visual Studio 10 C++;应用程序_C++_Visual Studio 2010_Visual C++_Dll_Runtime - Fatal编程技术网

C++ 将根据msvcrt.dll编译的libs链接到Visual Studio 10 C++;应用程序

C++ 将根据msvcrt.dll编译的libs链接到Visual Studio 10 C++;应用程序,c++,visual-studio-2010,visual-c++,dll,runtime,C++,Visual Studio 2010,Visual C++,Dll,Runtime,我需要在我的应用程序中使用一些针对msvcrt.dll编译的dll。我已经试过了,一切似乎都很好。但我首先担心的是对msvcrt.dll有额外的依赖性;我已经包含了VisualStudio10运行时库,希望不必再添加更多。我知道msvcrt.dll总是在Windows系统文件夹中,但我应该依赖它吗 以下是关于图书馆的页面: 我可以从零开始下载源代码并编译,而且可能会长期这么做,但现在我想确保链接这些库和使用DLL不会出现问题 在那一页上有一点是这样的: “使用这些二进制文件编译的每个程序都必须

我需要在我的应用程序中使用一些针对msvcrt.dll编译的dll。我已经试过了,一切似乎都很好。但我首先担心的是对msvcrt.dll有额外的依赖性;我已经包含了VisualStudio10运行时库,希望不必再添加更多。我知道msvcrt.dll总是在Windows系统文件夹中,但我应该依赖它吗

以下是关于图书馆的页面:

我可以从零开始下载源代码并编译,而且可能会长期这么做,但现在我想确保链接这些库和使用DLL不会出现问题

在那一页上有一点是这样的:

“使用这些二进制文件编译的每个程序都必须使用相同的运行时。除非您希望应用程序崩溃,否则请将项目设置为使用msvcrt.dll。如果出于某种原因必须使用不同的运行时,则必须获取源代码并自行编译libxml和friends。”

这就是我担心的。目前看来一切都很好,但我担心当它在其他设置不同的系统上出现时会发生什么

我知道msvcrt.dll总是在Windows系统文件夹中,但我应该依赖它吗

msvcrt.dll
由Windows拥有和维护。你可以相信它的存在,你不需要(也不应该)自己分发它

让DLL链接到不同的运行时版本是没有问题的,只要它们不跨DLL边界传递CRT定义的类型(例如,它们可能有不同的
std::vector
实现,因此将这样一个对象从与msvcr100.dll链接的dll传递到与msvcrt.dll链接的dll可能会导致问题,只要不在一个dll中分配内存,并在另一个dll中释放它(同样,他们可能会有不同的
malloc
/
free
实现,并且可能会使用不同的堆)


但是它们可以很好地共存,只要你不要求它们做任何“不合理”的事情,这需要它们知道另一个dll链接所针对的CRT版本。(我相信几乎每个程序最终都依赖于msvcrt.dll,因为如果没有其他东西,那么它们会链接到各种Windows dll,而这些dll又会链接到msvcrt.dll。因此,如果这种情况不安全,那么几乎所有为Windows编写的程序都会不安全)

通常在您创建或使用的DLL中,它们将取决于msvcrt的编号版本,例如:msvcrt90.DLL或其调试版本:msvcrt90d.DLL。或者可能是msvcrt100.DLL/msvcrt100d.DLL。这些DLL包含所谓的C运行时库的实现。也许您混淆了这个msvcrt.DLL和我上面提到的那些这是两件不同的事情

据我所知,msvcrt.dll是微软自己的操作系统内部版本。你不必担心、思考、扭头、皱眉,也不必为它而失眠

在“混合”C运行库时,唯一需要注意的一件事是不要从一个版本的CRT分配内存,并使用另一个版本的CRT释放内存。最终,这涉及从一个堆分配内存并释放另一个堆。这很糟糕,CRT会抱怨并抛出异常


如果您部署的应用依赖于任何特定版本的CRT,您也可以部署安装CRT的安装程序。事实上,Microsoft提供免费下载。例如,如果您编译的应用依赖于超旧版本的CRT(例如,windows不再附带该版本)当你启动你的应用程序时,唯一会发生的事情就是windows拒绝启动你的应用程序。它会给你一条神秘的消息,你必须通过谷歌才能弄清楚。

+1指出所有DLL最终都依赖于msvcrt.dllThanks,这几乎涵盖了我的担忧。关于内存分配和释放,我如果使用库中包含的函数调用可以吗?在这种情况下,我从我的应用程序中调用:xmlInitParser(),然后调用xmlcleanuparser(),它可以分别分配和取消分配内存。是的,如果DLL a调用DLL B中定义的释放内存的函数,那么内存由DLL B释放,所以(假设B是分配它的人),你就不用回家了。:)只要通过这样的包装函数完成,你就可以确保同一个DLL同时执行这两个操作没有混淆,我担心的是两者的混合。我已经用msvcrt100.DLL部署了应用程序。不过感谢你的回答:-)