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



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

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

#include <iostream>
int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

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

  1. "C/C++运行库"one_answers"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++运行库"应该静态地还是动态地链接到项目?

术语"C/C++运行库"没有任何意义,它大致是IDE中项目设置的名称。Project+属性,C/C++,代码生成,运行库设置。您可以在/MD和/MT之间进行选择。

在默认设置/MD的情况下,程序将使用运行库的DLL版本。在您的计算机上,Visual Studio安装程序会将它们复制到c:\windows\system32和/或c:\windows\syswow64中。在VS安装目录的vc/redit子目录中有它们的副本,在为程序创建安装程序时可以使用。它们的三个版本,x86用于32位英特尔处理器,x64用于64位英特尔处理器和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安装在用户机器上的一个简单方法是使用预构建的安装程序。您可以从这里下载(注意:仅限今天的最新版本,当service pack或更新可用时,情况可能会发生变化)。或者,您可以简单地将它们复制到与主EXE相同的目录中。

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

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

您的程序将在Windows Vista 7和8上运行。对XP的支持正在减弱,您需要VS Update 1并将项目中的工具集设置从"v110"更改为"v110_XP",以创建一个仍在XP上运行的程序。这样做会丢失一些功能,与区域设置和线程本地存储相关,需要进行测试。

这里什么都没有。。。如果你发现错误,请插话。

1."C/C++运行库"one_answers"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]

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

lib文件位于您的sdk的lib目录(如果您安装了更高版本的windows sdk)或Visual C++目录中。

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

您可以使用dependents工具来确定使用了哪些。http://www.dependencywalker.com/

DLL位于Windows目录中的某个位置。他们把它们四处移动,现在它在时髦的地方有清单和东西来跟踪版本。我不会太担心这个。如果你必须担心这一点,可能是出了问题。详细信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa375365(v=vs.85).aspxhttp://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中,而dll本应已经安装在用户的系统上,尽管有时情况并非如此。

b-如果运行时出现错误,微软可以向用户推送新版本。你不必处理它。如果你静态链接,你必须向用户推送一个新的exe。

为什么不使用dll:

a-处理dll的许多问题。如果您忘记捆绑redist,可能会出现许多问题。

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

可能还有其他我没有想到的原因。。。

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

这真的取决于情况。我个人更喜欢静态链接。我讨厌到处乱找合适的redist/dll/等。

相关内容

  • 没有找到相关文章

最新更新