我是Microsoft Visual Studio用户。我的问题是关于"C/C++运行库"。
我用一个".cpp"源文件"main.cpp"创建了一个"空项目",其中包含以下代码:
#include <iostream>
int main(void)
{
std::cout << "Hello World" << std::endl;
return 0;
}
"iostream是C++编程语言中用于输入/输出的头文件。它是C++标准库的一部分。"
"C/C++运行库"one_answers"C/C++标准库"?
如何知道"C/C++运行库"库是静态还是动态链接到项目?
我如何知道这个库在文件系统中的位置?
在这种情况下,"C/C++运行库"动态链接到项目,我如何知道使用了哪个".dll"以及在哪里使用".dll"是否位于文件系统中?
假设我将"C/C++运行库"静态链接到项目,我能确定源代码生成的可执行文件将在所有Windows平台(XP/Vista/Seven/…,32位/64位)上运行吗?
将"C/C++运行库"动态链接到项目有哪些优点/缺点?
"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/等。