我對執行庫的理解
技術標籤:編譯工具
一、libc、glibc
Linux系統有自己的底層操作函式,如底層輸入輸出(Low-Level Input/Output):
- 開啟檔案:open
- 關閉檔案:close
- 讀取檔案:read
- 寫入檔案:write
- 操作檔案指標:lseek
隨便拿個open作說明:int open (const char *filename, int flags, mode t mode);
,如果要完成檔案寫入一個Hello World可不容易,因為我們必須熟悉作業系統中對flags和模式的設定,設定相當麻煩。C標準庫就是完成對這些常見的操作的封裝,當我們使用#include <stdio.h>
fopen
開啟檔案,fprintf
輸出文字檔案。這些封裝好的函式被打包成一個動態庫,叫做執行時庫。程式執行時,將會呼叫這些執行庫中的函式,這就是為什麼我們需要執行庫的原因,如果沒有這些庫,編寫C語言作業系統可不認識。這就是為什麼執行庫總是和作業系統、語言相關。任何一個C 程式,它的背後都有一套龐大的程式碼來進行支撐,以使得該程式能夠正常執行。這套程式碼至少包括入口函式,及其所依賴的函式所構成的函式集合。另外包括各種標準庫函式的實現。
這樣的一個程式碼集合稱之為執行時庫(Runtime Library),C 語言的執行時庫,稱為 C 執行庫(CRT)。 C 執行庫大致包含的功能:
- 啟動與退出函式
- 由C 語言標準規定的C 語言標準庫所擁有的函式實現。
- I/O 功能的封裝與實現。
- 堆的封裝和實現
- 語言中一些特殊功能的實現。
- 實現除錯功能的程式碼。
在這些執行庫的組成成分中,C語言標準庫佔據了主要地位並且大有來頭。C語言標準庫是C語言標準化的基礎函式庫,我們平時使用的printf、exit等都是標準庫中的一部分。標準庫定義了C語言中普遍存在的函式集合,我們可以放心地使用標準庫中規定的函式而不用擔心在將程式碼移植到別的平臺時對應的平臺上不提供這個函式[1]。
像是libc、glibc只是兩種執行庫的實現。ubuntu系統中,使用的標準庫實現是glibc[2],他在系統的/lib/x86_64-linux-gnu/libc.so.6
ldd --version
作為一個動態庫,也會存在版本問題。比如高版本編寫的程式,在低版本執行。解決方法有:
- 在低版本進行編譯
- LD_LIBRARY_PATH=./ 高版本的libc/libstdc++拷貝到當前程式目錄下
QT為程式提供了介面相關的功能,其功能和libc一樣封裝在一個執行庫中。
[1] https://blog.csdn.net/yexiangCSDN/article/details/83899116?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
[2] https://stackoverflow.com/questions/54053087/libc-or-glibc-in-ubuntu
[3] https://www.zhihu.com/question/23779949