2017-10-12 100 views
4

什麼是運行時庫?我已閱讀this,因此我對它的目的有一個正確的理解,但是它是一個文件嗎?它是否可以像標準庫一樣明確包含?具體是什麼運行時庫?

+0

@ user0042感謝您的輸入,但是它是如何顯示實際運行時庫的?就像您可以自己閱讀的物理文件一樣,包括等等...... – Rocket

+0

正如我所說的,我已經閱讀了有關該術語的內容。我只是喜歡他們的一些例子。 – Rocket

+0

運行時庫是代碼(函數等)的集合,用戶程序(例如,您編寫的程序)需要它們才能正常工作。例如,在調用main()函數之前執行的C++標準庫和代碼通常是運行時庫的一部分 - 大多數C++程序在沒有它的情況下無法做任何有用的事情。運行時庫可能是一個單獨的可執行文件(例如,您的程序無法運行的Windows DLL窗口),或者鏈接器可能會在編譯時直接將代碼複製到可執行文件中,以便程序運行「獨立」或這些組合。可能性繼續 – Peter

回答

1

有靜態和動態(運行時)庫。

來自靜態庫的代碼在編譯時放入可執行文件中(鏈接器執行此操作)。所以這段代碼可能會膨脹你的可執行文件,但它在每臺計算機上都有相同的代碼。

當您使用動態庫(Windows中的.dll,Linux中的.so)時,該函數僅作爲鏈接存儲(從ABC.dll調用XYZ())。在執行二進制文件時,操作系統將這些庫加載到可執行文件的地址空間中並解析鏈接。所以你的可執行文件比較小,這個庫可以被許多程序使用。當這個庫存在缺陷時,每個程序只能替換一次。但是,這隻適用於如果庫的接口只是小心改變,否則 - 歡迎來到DLL地獄。

2

首先,它是概念:在目標平臺上提供語言功能所需的代碼。

即它是執行strlenfeclearexceptofstream::operator<<所有其他標準庫函數的語言可用。

它也可能包含「膠水代碼」,例如確保您的'main'在程序啓動時被正確的參數調用,以及與目標OS的其他交互。


像許多概念,它有不同的「物理」表現(物理作爲一個文件即可)。他們依賴於語言的實現細節,但常見的有:編譯時可用

  • 頭文件,包含內嵌的實現(如標準模板Libary)

  • 靜態庫(.OBJ或.LIB )文件,包含已編譯的函數,並在鏈接期間包含在可執行文件中。

  • 動態庫文件(.dll或.so)需要在執行過程中可用的文件

  • 「特殊的東西編譯器或鏈接做」創建可執行

一個典型的C++時程序可能會看到「所有上述」。

靜態庫通常由C,C++或實現標準庫函數,其通常使用目標OS的fucntionality(例如,Windows CreateFile爲fstreams)

的動態庫程序包(的大型工件裝配代碼創建)這些靜態庫作爲.dll或.so。

使用動態庫需要相應的運行要在目標平臺上安裝,但使用起來也減少了你的可執行文件,並從更新到您的運行時已安裝的應用效益的大小。


如上所述,這是實現依賴。可能有任何數量的附加文件(例如數據文件,配置文件,調試符號,圖標等)與運行時相關聯和包含在運行時中。

這裏的另一個重要方面是:語言提供了目標平臺的抽象,抽象層是在運行時實現的。