2014-09-01 176 views
2

我一直在尋找和閱讀了一段時間,但仍然無法得到乾淨的答案:運行庫和動態庫

什麼是運行時庫和動態庫之間的區別?

具體而言,我想知道以下幾個方面:

如何在建設過程中運行時庫的工作?

它爲什麼叫做「運行時」?它是否總是被加載到內存中?

+0

[靜態庫和共享庫之間的差異?](http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries) – Abhinav 2016-08-31 00:55:41

回答

2

通常有類型的圖書館來講可執行如何訪問它們:

  • 靜態的;
  • 動態,自動加載;和
  • 動態,手動加載。

靜態庫往往在構建時鏈接到可執行文件,通常由鏈接器。因此可執行文件永遠與這些庫「卡在一起」。

動態庫是「後期綁定」的,它們往往在代碼運行或即將運行時與您的可執行文件鏈接。這就是運行時意味着什麼,在運行時完成的,與編譯時靜態鏈接相對比)。

自動加載一個由操作系統(加載程序)處理,而無需在代碼中執行任何特定操作。在構建時,您已經指定了在可執行文件加載時需要什麼庫,但是這些庫與可執行文件的實際鏈接稍後會發生。

這意味着您可以替換庫以影響您的可執行文件的工作方式,不需要重新鏈接可執行文件(與靜態鏈接不同)。

手動動態庫是您從代碼中明確加載庫的位置,可調用諸如dlopen(打開庫)和dlsym(以獲取該庫中符號的地址)。

您可能還想看看this answer,關於靜態/動態的區別。


覆蓋類型你很可能會遇到,但是,在你在註釋中提供的鏈接而言庫,它出現在「運行時庫」,這裏被稱爲是一個簡單的提供一些語言功能的庫。

例如,C運行時庫是一個庫,其中包含用於打開文件的fopen()或用於複製字符串的strcpy()。儘管編譯器理解核心語言(if,while等,包括如何調用函數),但非核心語言功能是作爲包含可調用函數的庫提供的。從這個意義上說,動態庫和運行時庫之間的差異是不協調的,因爲它們涉及不同的概念。運行時庫可以提供爲靜態的動態。

+0

我也從來沒有聽說過它。但是[這裏](http://en.wikipedia.org/wiki/Runtime_library)是。 – Zhi 2014-09-01 02:52:26

+0

我還在http://www.openmp.org/wp-content/uploads/omp-hands-on-SC08.pdf找到這裏的術語:第7頁。不確定這是什麼意思「運行時庫」 – ransh 2017-03-27 10:54:29