2013-10-07 48 views
0

我與接頭概念混淆什麼是編程中的動態鏈接器?

  1. 我們可以使用連接在java中
  2. 如果是在android開發如何對鏈接發生的呢?
+0

鏈接器是一個應用程序,它接受編譯對象文件(由編譯器發出),並使用它們將可執行文件「鏈接」到其必要的庫中。在Java中最接近的鏈接將是一個[類加載器](http://stackoverflow.com/questions/2424604/what-is-a-java-classloader)...不知道你想從哪裏去,但在android開發中它的工作原理也是一樣的。 – PinnyM

+0

@pinny - >這個類加載器負責可執行文件嗎? –

+1

在Java中,您不會以標準意義上的可執行文件結束。只有一堆字節碼編譯對象('jars'),其中至少有一個將提供JVM可以調用的入口點。因此,鏈接器的主要功能並不是真的需要。類加載器在運行時協助JVM將必需的對象集中在一起執行。 – PinnyM

回答

3

A linker是一個程序,它將單獨編譯的文件合併爲一個可執行程序。

想象一下,你有一個程序,有兩個文件:一個具有啓動程序的主要功能外,其他定義的輔助功能。當編譯器在主文件上工作時,它會產生調用輔助函數的代碼,但實際上並不知道它是否存在或者它是幹什麼的。然後鏈接程序接管並「解析」函數調用,以便在程序運行時輸入正確的函數。

基本上有兩種類型的接頭:

  • 靜態接頭運行執行之前,產生一個可執行程序文件或庫。
  • a dynamic linker在程序運行時運行,在不同的庫中查找需要的符號。

通常,鏈接器概念僅適用於OS級別的本機代碼。如果你想將它應用到Java,你可以說它只使用動態鏈接;鏈接器已集成到JVM中。

+0

好的...混淆擴大..謝謝。 –

1

linker是一個計算機程序,它接受由編譯器生成的一個或多個對象文件並將它們組合成一個單一的可執行程序。計算機程序通常包括幾個部分或模塊;這些部件/模塊不需要全部包含在單個目標文件內,並且在這種情況下通過符號彼此參照。當一個程序包含多個目標文件時,鏈接程序將這些文件組合成一個統一的可執行程序,在符號進行時解析它們。

許多操作系統環境允許動態鏈接,這是一些不確定的符號解決的推遲程序運行,直到。這意味着可執行代碼仍然包含未定義的符號,以及將爲這些符號提供定義的對象或庫列表。加載程序也會加載這些對象/庫,並執行最終的鏈接。動態鏈接不需要鏈接器。

「鏈接器」在java世界中沒有意義。一個類加載器的概念 - 給定一個java字節代碼數組可以創建一個Class的內部表示,這在前面已經是真實的。現在Java 9已有Linker

0

當Java編譯器運行時,它會爲程序中的每個類或接口生成一個單獨的字節碼文件(擴展名爲* .class)。這些文件彼此進行符號連接以及Java API的類文件。

在運行時,Java虛擬機加載程序文件和一個稱爲動態鏈接過程中它們組合。

0

與C/C++,Java中(懶惰地或熱切)經由JVM鏈接步驟處理@runtime。所以沒有像Java鏈接器這樣的東西。 JVM負責它。

在Android中,在Lollipop之前,JVM負責完成鏈接。 AOT出現後(提前編譯),這些事情開始接近C/C++的方式。這意味着,在運行應用程序之前完成編譯和鏈接。

相關問題