動靜態庫

zhudachang發表於2024-10-03
  1. 靜態庫:
    副檔名:.a
    連結方式是在編譯時候直接整合到可執行檔案中。

  2. 動態庫
    副檔名字:.so
    連結方式是在執行時,根據符號表查詢動態庫的位置

  3. 庫檔案:就是把多個“.o檔案”打一個包,給對方提供一個庫檔案。
    使用ar命令生成靜態庫
    ar -rc libmymath.a add.o sub.o

  4. 交付庫-》庫檔案.a .so +匹配的標頭檔案都給別人。所謂的安裝:本質就是複製

  5. 如果需要連結第三方的庫,必須指明庫名稱!!!

gcc會預設指定c語言的標準庫,g++會自動指定c++的標準庫

庫的名稱是去掉字首和字尾,比如libmymath.a 那麼庫的名字叫mymath,-lmymath

  1. gcc預設是動態庫。

  2. 系統中,透過複製來實現安裝。

  3. 動態庫:
    生成動態庫:對於每個.c檔案需要 gcc -c -fPIC my_add.c 生成.o檔案,然後使用 gcc -share -o lib my math.so my_add.o my_sub.o

執行動態連結的執行檔案:與靜態連結的可執行檔案(gcc只需要在編譯時候指明路徑和檔名字)不同。
動態連結的路徑指明方式是:

  • 修改環境變數中的動態庫的路徑:$LD_LIBRARY_PATH
  • 修改環境變數
  • 使用軟連結在本地路徑下生成一個新的檔案,這樣子也可以找到。

ncourses 庫(第三方庫)

  1. 靜態庫載入:
    虛擬地址空間,可執行程式在編譯時候就考慮到虛擬地址。靜態庫載入進程式碼區。

  2. 動態庫載入:動態庫中的指定函式的地址,寫入到我們的可執行程式中。動態庫中函式只需要填入在庫中的偏移量地址數。在可執行程式需要執行一個外部動態庫的函式的時候,會把動態庫載入進記憶體,透過頁表對映到pcb中的共享區,那麼只需要庫在共享區的起始地址和函式在動態庫的偏移量地址。就可以找到函式的程式碼了。

在記憶體中,就算有一百個可執行程式需要使用同一個動態庫,那麼這個動態庫在記憶體中只會有一份,而且是透過對映的方式存在於可執行程式中。

相關文章