2016-10-01 57 views
0

为什么Visual Studio默认包含kernel32.dll,user32,dll,winspool.lib等的附加依赖关系......?为什么我们需要在Windows C++中链接kernel32.dll,user32.dll等...?

为什么这些资源需要链接到Windows上的C++项目中,并且它们是否真的变成了机器代码并直接插入到每个可执行文件中,或者它们与可执行文件保持分离,并且在运行时间它们之间建立了链接?

+0

另请参阅https://en.wikipedia.org/wiki/Dynamic-link_library –

+0

谢谢,这是非常有益的。这个页面也很有帮助,因为它回答了第二个问题,即在链接时间或运行时是否将DLL加载到实际的可执行文件中,并且它可能取决于具体情况:http://stackoverflow.com/问题/ 3573475/how-do-import-library-work-details。 –

+0

不,不会在链接时将DLL加载到可执行文件中。您所链接问题的答案是误导性的。他们正在讨论加载时动态链接(当DLL作为进程启动过程的一部分加载时)和运行时动态链接(应用程序的代码明确加载DLL)之间的区别。令人困惑的是,加载时动态链接通常被称为“静态链接”,但这是一种误用。 –

回答

3

为了使C++应用程序能够在windows下运行,它至少需要一些系统服务。例如,它需要分配和释放内存,它需要获取它所调用的命令行参数,并且在完成时需要能够退出到操作系统。通常,它还需要以某种方式接收输入并产生输出,无论是通过GUI,还是通过控制台,或者仅仅通过读写文件系统上的文件。

这些服务都不是魔术提供的;它们中的每一个都是由kernel32.dll,user32.dll等提供的。因此,几乎每个C++程序都需要链接这些DLL。

从理论上讲,编写一个自我包含的程序可能不需要任何这些DLL,但是这样的程序几乎不能做任何事情:一旦加载,它将被限制为没有任何投入,也没有产出。因此,出于所有实际的目的,除此之外,没有人会知道程序实际上运行。