03.07 c/c++運行時dll在不知道main函數的情況下是怎樣編譯成功的?

岩石龍


首先,你是不是想說調用dll? 調用過程是運行時發生的,編譯時不驗證這個,因此編譯成功沒什麼問題。但是,儘管你可以編譯成功,但運行的時候還是有可能報出缺少dll的異常…


成都茂大叔


首先明確main函數是什麼:main函數是程序入口,程序從這裡開始運行。

然後再來明確2個東西:可執行文件exe和動態鏈接庫dll。(dll在windows環境下是動態鏈接庫,exe在windows環境下是可執行文件)

什麼是可執行文件?可執行文件就是編譯好後,生成的文件可以運行某種功能。你雙擊exe文件會運行一定的功能(比如彈出窗口之類的),而這個功能就是從main函數開始運行的,因為main函數是程序入口,即程序從這裡開始運行。

什麼是動態鏈接庫?動態鏈接庫是封裝好的,能實現一類功能的獨立函數包,可以把dll看做是寫好的c++函數,只是後綴名從cpp變成了dll(實際上編譯器還會優化代碼),且dll是被調用的,不能主動運行。即你雙擊dll文件不會運行,所以它不需要main函數。

你在配置工程的時候會選擇輸出是可執行文件或者動態鏈接庫,編譯器知道dll是沒有main函數的,所以編譯器就能編譯成功。


遛電子的老李


動態庫與main無關係。

你問題涉及到動態庫的兩個方面。

一是運行時,既程序運行過程,這個過程main函數由系統來執行,動態庫則分為動態加載和靜態加載兩種,靜態加載由系統負責查找和加載,動態加載由你的可執行程序或者另外動態庫通過系統接口加載給定動態庫,所以運行時動態庫與main函數無關。

二是編譯時,既動態庫生成過程,該過程只需要能夠找到動態庫中用到的接口即可,而且不能夠是main接口(main只能由系統運行),所以動態庫編譯時也無main函數無關。


小樂爸爸


你的這個問題首先有個錯誤要糾正:C/C++程序能夠運行起來,必須要先編譯,只有編譯成功了才有可能運行起來,如果沒有入口函數main,程序也是運行不起來的。dll在windows下是屬於動態庫,他是不能單獨運行的,必須要有帶有main函數的程序來調用才能夠發揮本身動態庫封裝的功能。


一粒塵土一個世界


exe是以main函數為入口編譯優化。dll是以導出函數為入口編譯優化。看起來exe像是隻有一個名稱為main的導出函數的dll,其實exe也可以導出其他函數,兩者沒有本質區別。


無盡的代碼


編譯dll文件是不需要文件裡有main函數的,dll文件編譯後,可作為一個可執行模塊,被其他程序調用。


公考一卒


應用程序從main開始執行,按名稱或編號引用dll中的函數,第一次調用時建立鏈接:裝載動態庫,確定函數地址,替代調用點的被調用地址。


ScholarMartin


我去,可以模擬一個空的main函數啊


羊羊羊146777668


main函數只是程序的運行入口函數 跟編譯有啥關係


分享到:


相關文章: