我是Microsoft Visual Studio用户。 我的问题是关于" C / C ++运行时库"。
我创建了一个"空项目"用" .cpp"源文件" main.cpp"包含以下代码:
#include <iostream>
int main(void)
{
std::cout << "Hello World" << std::endl;
return 0;
}
&#34; iostream是一个头文件,用于C ++编程语言的输入/输出。 它是C ++标准库的一部分。&#34;
&#34; C / C ++运行时库&#34;之间是否存在差异?和&#34; C / C ++ 标准图书馆&#34;?
我如何知道&#34; C / C ++运行时库&#34; 库是静态还是动态链接到项目?
如何知道此库在文件系统中的位置?
如果是&#34; C / C ++运行时库&#34;动态链接到 项目,我怎么知道哪个&#34; .dll&#34;使用和使用的地方 &#34;的.dll&#34;位于文件系统中?
假设我静态链接&#34; C / C ++运行时库&#34;在项目中,我可以确定从源代码生成的可执行文件是否适用于所有Windows平台(XP / Vista / Seven / ...,32位/ 64位)?
动态链接&#34; C / C ++运行时库&#34;有哪些优点/缺点?到项目?
&#34; C / C ++运行时库&#34;而是静态或动态地链接到项目?
答案 0 :(得分:58)
术语“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名称是:
在您的计算机上,您还获得了这些DLL的调试版本,由VS安装程序复制到Windows目录中。它们具有相同的名称,并附加字母“d”。仅用于调试代码,不能重新分发它们。相应的运行时库设置为/ MDd。
大多数C ++项目只需要msvcr110.dll和msvcp110.dll,你知道什么时候选择使用其他库,因为它们有特定的项目模板和设置。
在用户的计算机上安装所有这些DLL的简单方法是使用预构建的安装程序。您可以下载from here(注意:截至今天,当服务包或更新可用时,这可能会更改)。或者您只需将它们复制到与主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 :(得分: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]
第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
如果这是一个问题,您可以将可再发行软件包与安装程序捆绑在一起:Difference between Visual Studio Redistributable and 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 / etc。