2016-10-01 58 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,但是這樣的程序幾乎不能做任何事情:一旦加載,它將被限制爲沒有任何投入,也沒有產出。因此,出於所有實際的目的,除此之外,沒有人會知道程序實際上運行。