静态链接如何与系统文件一起使用?

时间:2019-06-18 13:19:04

标签: c++ visual-c++

我是一名C ++初学者,我正在尝试在Visual Studio中制作一个完全静态的程序(只有一个.exe)。不过,这让我开始思考,因为从用户计算机中提取了一些外部依赖项,例如MSVCP.dll。这些依赖关系是从程序员的计算机中烘焙到程序中的,还是仍被遗漏并从用户那里拉出来了?

-阿里

2 个答案:

答案 0 :(得分:1)

  

这些依赖关系是从程序员的计算机烘焙到程序中的,还是仍被遗漏并从用户那里拉出来了?

作为@Igor注释,您可以选择其中之一。区别是一个(也许很大)单个独立的静态链接的可执行文件,或者一个依赖于本地DLL来运行的文件。

答案 1 :(得分:1)

MS Visual C ++编译器使您可以选择要链接到哪个版本的MS Visual C / C ++运行时库。选择是:

  • / MT-静态链接到CRT的非调试多线程版本。这样的好处是不需要您将CRT DLL与您的应用程序一起交付,否则它可能需要在其他系统上运行。缺点是必须将应用程序使用的CRT代码烘焙到可执行文件中,从而增加其大小。如果您的应用程序具有多个可执行文件和DLL,这将变得更加复杂,因为许多相同的CRT代码将必须嵌入其中。
  • / MTd-静态链接CRT的调试多线程版本。与上面相同,但是添加的调试信息将使其运行速度变慢甚至更大。主要对开发版本有用。
  • / MD-动态链接到CRT的非调试多线程版本的DLL。这样可以减小程序可执行文件的大小。如果您的应用程序包含多个可执行文件和DLL,则节省的费用可能会增加,因为它们之间可以共享相同的CRT代码。但是,这可能需要您运送CRT DLL或让用户单独安装它们,这可能会带来额外的麻烦和复杂性。
  • / MDd-动态链接到CRT调试多线程版本的DLL。与上述相同,但添加的调试信息将运行缓慢。主要对开发版本有用。

使用简单的hello world程序进行快速测试,使用/ MD时,编译后的可执行文件最终约为12KB,而使用/ MT时,编译后的可执行文件的重量约为219KB,因此大小差异很大,尤其是当您使用运送了很多小程序。


以前,该库还具有单线程版本,从理论上讲,它们可以提供更好的单线程性能和更小的大小,但不再提供较新的CRT版本。大概之间的差别太小了,以至于无法运送整个单独的库版本。