Microsoft Visual Studio~C/C++运行时库〜静态/动态链接

Léa*_*iot 41 c++ visual-studio microsoft-runtime-library

我是Microsoft Visual Studio用户.我的问题是关于"C/C++运行时库".

我用".cpp"源文件"main.cpp"创建了一个"空项目",其中包含以下代码:

#include <iostream>

int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

"iostream是一个头文件,用于C++编程语言的输入/输出.它是C++标准库的一部分."

  1. "C/C++运行时库"和"C/C++标准库"之间有区别吗?

  2. 我如何知道"C/C++运行时库"库是静态还是动态链接到项目?

  3. 我如何知道这个库在文件系统中的位置?

  4. 如果"C/C++运行时库"动态链接到项目,我怎么知道使用了哪个".dll"以及用过的".dll"在文件系统中的位置?

  5. 假设我将"C/C++运行时库"静态链接到项目,我可以确定从源代码生成的可执行文件可以在所有Windows平台上运行(XP/Vista/Seven/...,32位/ 64位)?

  6. 将"C/C++运行时库"动态链接到项目有哪些优点/缺点?

  7. "C/C++运行时库"应该静态地还是动态地链接到项目?

Han*_*ant 60

术语"C/C++运行时库"并不意味着什么,它大致是IDE中项目设置的名称.项目+属性,C/C++,代码生成,运行时库设置.在那里你可以选择/ MD和/ MT.

使用/ MD(默认设置),您的程序将使用运行时库的DLL版本.在您的计算机上,Visual Studio安装程序将它们复制到c:\ windows\system32和/或c:\ windows\syswow64中.并且您已经在VS安装目录的vc/redist子目录中获得了它们的副本,供您在为程序创建安装程序时使用.它们有三个版本,x86用于32位Intel处理器,x64用于64位Intel处理器,arm用于ARM处理器.根据您在项目中选择的平台选择正确的一个.

相关的DLL名称是:

  • msvcr110.dll:C运行时库(memcpy等)
  • msvcp110.dll:C++标准库(std :: string等)
  • vccorlib110.dll:Windows应用商店应用程序的运行时库
  • vcomp110.dll:OpenMP的运行时库(请参阅#pragma omp)
  • atl110.dll:ATL项目的运行时库
  • mfc110*.dll:MFC项目的运行时和本地化库
  • vcamp110.dll:AMP项目的运行时库

在您的计算机上,您还获得了这些DLL的调试版本,由VS安装程序复制到Windows目录中.它们具有相同的名称,并附加字母"d".仅用于调试代码,不能重新分发它们.相应的运行时库设置为/ MDd.

大多数C++项目只需要msvcr110.dll和msvcp110.dll,你会当您选择加入,因为有他们特定的项目模板和设置使用其他库知道.

在用户的计算机上安装所有这些DLL的简单方法是使用预构建的安装程序.您可以从此处下载(注意:截至今天,当服务包或更新可用时,这可能会更改).或者您只需将它们复制到与主EXE相同的目录中即可.

您可以通过将运行时库设置更改为/ MT来避免对这些DLL的依赖.在这种情况下,运行时支持代码链接到您的程序中,您只需要部署一个EXE.当你这样做时,它当然会变得更大,有时甚至会更大,尤其是当你使用MFC时.

如果您创建DLL和EXE,使用/ MT是有风险的.您最终会在程序中使用CRT的多个副本.对于早期版本的VS来说,这尤其是一个问题,其中每个CRT都会获得自己的堆,而不是VS2012.但是,当你有多个"errno"变量时,你仍然会遇到难看的运行时问题.强烈建议使用/ MD以避免此类损失.

你的程序将在Windows Vista中,7和8.支持XP正在减弱运行,你需要VS更新1和"V110"的项目更改工具箱设置"v110_xp"创建仍然在XP上运行的程序.执行此操作时会丢失某些功能,与区域设置和线程本地存储相关联,需要进行测试.


tha*_*ang 20

这里什么都没有......如果你发现错误,请发出声音.

1."C/C++运行时库"和"C/C++标准库"之间有区别吗?

是的,不是.有时人们使用运行时库来表示一切并完全忽略标准库(对于Microsoft工具).但是,从技术上讲,运行时库是在运行时加载的,因此它包含一对.lib(import lib)和.dll.详情请见:http: //msdn.microsoft.com/en-us/library/vstudio/abx4dbyh(v = vs.100).aspx

从技术上讲,libc*是标准库,*crt是运行时库.

2.我如何知道"C/C++运行时库"库是静态还是动态链接到项目?

如果您正在使用IDE(VS2010,其他类似),则这是在项目属性中:

-  configuration properties
        - c/c++
               - code generation
                      [Runtime Library]
Run Code Online (Sandbox Code Playgroud)

3.我如何知道这个库在文件系统中的位置?

lib文件位于sdk的lib目录中(如果安装了以后的windows sdk)或Visual C++目录.

4.如果"C/C++运行时库"动态链接到项目,我怎么知道使用了哪个".dll"以及用过的".dll"在文件系统中的位置?

您可以通过使用depends工具找出使用的是哪些. http://www.dependencywalker.com/

DLL位于Windows目录中的某个位置.他们移动它们,它现在在时髦的地方,有清单和东西来跟踪版本.我不会太担心这个.如果你不得不担心这一点,那可能是错的.有关详情: http://msdn.microsoft.com/en-us/library/windows/desktop/aa375365(v=vs.85).aspx http://en.wikipedia.org/wiki/Side-by-side_assembly

如果这是一个问题,您可以将可再发行组件包与您的安装程序捆绑在一起:Visual Studio Redistributable和Visual Studio SP1之间的区别

5.假设我将"C/C++运行时库"静态链接到项目,我可以确定从源代码生成的可执行文件将适用于所有Windows平台(XP/Vista/Seven/...,32位)/64位)?

是的,如果您静态链接,那么就无法找到dll而言,您会更安全.但是,这会使您的可执行文件更大.在行为方面还有其他后果......难以枚举,但差异来自于库在dll中编译到你的exe中的事实.

6.将"C/C++运行时库"动态链接到项目有哪些优点/缺点?

为什么要使用DLL:

a - 大小.较小的exe大小,因为所有的库内容都在dll中,应该已经安装在用户的系统上,尽管有时这不是真的.

b - 如果运行时存在错误,Microsoft可以将新版本推送给用户.你不必处理它.如果您静态链接,则必须向用户推送新的exe.

为什么不使用DLL:

a - 处理dll的许多问题.如果你忘了捆绑redist,很多问题都会出现.

b - 有更多的dll加载和卸载会导致启动和退出时间变慢.

可能是我没有想到的其他原因......

7."C/C++运行时库"是否应该静态或动态地链接到项目?

这真的取决于.我个人更喜欢静态链接.我讨厌在寻找合适的redist/dll /等.