回答
A linker是一個程序,它將單獨編譯的文件合併爲一個可執行程序。
想象一下,你有一個程序,有兩個文件:一個具有啓動程序的主要功能外,其他定義的輔助功能。當編譯器在主文件上工作時,它會產生調用輔助函數的代碼,但實際上並不知道它是否存在或者它是幹什麼的。然後鏈接程序接管並「解析」函數調用,以便在程序運行時輸入正確的函數。
基本上有兩種類型的接頭:
- 靜態接頭運行執行之前,產生一個可執行程序文件或庫。
- a dynamic linker在程序運行時運行,在不同的庫中查找需要的符號。
通常,鏈接器概念僅適用於OS級別的本機代碼。如果你想將它應用到Java,你可以說它只使用動態鏈接;鏈接器已集成到JVM中。
好的...混淆擴大..謝謝。 –
甲linker是一個計算機程序,它接受由編譯器生成的一個或多個對象文件並將它們組合成一個單一的可執行程序。計算機程序通常包括幾個部分或模塊;這些部件/模塊不需要全部包含在單個目標文件內,並且在這種情況下通過符號彼此參照。當一個程序包含多個目標文件時,鏈接程序將這些文件組合成一個統一的可執行程序,在符號進行時解析它們。
許多操作系統環境允許動態鏈接,這是一些不確定的符號解決的推遲程序運行,直到。這意味着可執行代碼仍然包含未定義的符號,以及將爲這些符號提供定義的對象或庫列表。加載程序也會加載這些對象/庫,並執行最終的鏈接。動態鏈接不需要鏈接器。
「鏈接器」在java世界中沒有意義。一個類加載器的概念 - 給定一個java字節代碼數組可以創建一個Class的內部表示,這在前面已經是真實的。現在Java 9已有Linker
當Java編譯器運行時,它會爲程序中的每個類或接口生成一個單獨的字節碼文件(擴展名爲* .class)。這些文件彼此進行符號連接以及Java API的類文件。
在運行時,Java虛擬機加載程序文件和一個稱爲動態鏈接過程中它們組合。
與C/C++,Java中(懶惰地或熱切)經由JVM鏈接步驟處理@runtime。所以沒有像Java鏈接器這樣的東西。 JVM負責它。
在Android中,在Lollipop之前,JVM負責完成鏈接。 AOT出現後(提前編譯),這些事情開始接近C/C++的方式。這意味着,在運行應用程序之前完成編譯和鏈接。
- 1. 什麼是靜態和動態鏈接
- 2. 動態鏈接器和動態加載器有什麼區別?
- 3. 鏈接/連接列出動態/編程
- 4. 爲什麼我的交叉編譯器工具鏈不是靜態鏈接?
- 5. 什麼是靜態庫,靜態鏈接動態庫和動態鏈接動態庫的.lib文件?
- 6. 靜態鏈接庫和動態鏈接庫之間的區別是什麼
- 7. 什麼是JVM中的動態鏈接失敗?
- 8. Eclipse中「與編輯器鏈接」功能的作用是什麼?
- 9. 節點/鏈接編程接口的通用術語是什麼?
- 10. socket編程中的接口是什麼?
- 11. 什麼是GNU鏈接器中的部分鏈接?
- 12. 爲什麼在動態鏈接器啓動之前調用_dl_fixup?
- 13. 編譯動態鏈接庫
- 14. 編譯動態鏈接庫
- 15. 什麼是編譯器中的動態優化
- 16. dlopen vs標準動態鏈接的用例是什麼?
- 17. Visual C++:什麼是動態鏈接的.lib文件?
- 18. 在Python中靜態鏈接和動態鏈接意味着什麼?
- 19. Qt C++我的程序是使用靜態鏈接還是動態鏈接?
- 20. 接口編程的目的是什麼?
- 21. 爲什麼/ MD是編譯器的選擇?不是鏈接器的?
- 22. 鏈接器/編譯器中的解析引用是什麼意思?
- 23. 動態鏈接和動態加載有什麼區別
- 24. 什麼是實際動態超鏈接列?
- 25. 動態編程:拉鍊
- 26. Facebook的靜態鏈接中的額外參數是什麼?
- 27. 加載動態鏈接器
- 28. 什麼是直接鏈接和鏈接的靜態libarary之間的區別
- 29. 將錯誤與「math.h」鏈接 - 告訴鏈接器鏈接的選項是什麼?
- 30. makefile中鏈接的順序是什麼?
鏈接器是一個應用程序,它接受編譯對象文件(由編譯器發出),並使用它們將可執行文件「鏈接」到其必要的庫中。在Java中最接近的鏈接將是一個[類加載器](http://stackoverflow.com/questions/2424604/what-is-a-java-classloader)...不知道你想從哪裏去,但在android開發中它的工作原理也是一樣的。 – PinnyM
@pinny - >這個類加載器負責可執行文件嗎? –
在Java中,您不會以標準意義上的可執行文件結束。只有一堆字節碼編譯對象('jars'),其中至少有一個將提供JVM可以調用的入口點。因此,鏈接器的主要功能並不是真的需要。類加載器在運行時協助JVM將必需的對象集中在一起執行。 – PinnyM