Linux C/C++編程之(十)動態庫的製作和使用

一、概述

在這裏插入圖片描述

二、動態庫的優缺點

機制:

  • 共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,因此代碼體積較小。

優點:

  • 節省內存(共享)
  • 易於更新(動態鏈接)
    • 停止運行程序
    • 使用新庫覆蓋舊庫(保證新舊庫名稱一致,接口一致)
    • 重新啓動程序

缺點:

  • 延時綁定,速度略慢

使用場合:

  • 對速度要求不是很強烈的地方都應使用動態庫

注意事項:

  • 動態庫是否加載到內存,取決於程序是否運行

命名格式:

  1. lib開頭
  2. 動態庫名
  3. .so結尾

三、動態庫的製作

(1)製作步驟

1)生成“與位置無關“的目標文件。

gcc -fPlC a.c b.c c.c -c
  • 參數:-PIC 表示生成與位置無關代碼
  • 執行完畢後生成一系列的 .o 文件

2)製作動態庫

gcc -shared -o libmytest.so a.o b.o c.o
  • 參數:-shared 製作動態庫
  • -o:重命名生成的新文件

3)使用動態庫

gcc main.c -L ./ -Imytest -I / -o app
  • -L–>指定庫所在的路徑
  • 去掉前綴 lib
  • 去掉後綴 .so
  • 只留下中間部分
  • -I–>頭文件目錄位置

/.app–>運行失敗

  • 查看依賴的共享庫:ldd app 發現 libmytest 找不到
  • 沒有給動態鏈接器(ld-linux.so.2)指定好動態庫 libmytest.so 的路徑
  • 解決方案
    1. 臨時設置:export LD_LIBRARY_PATH=庫路徑,將當前目錄加入環境變量,但是終端退出了就無效
    2. 永久設置:將上條寫入家目錄下 .bashrc 文件中
    3. 粗暴設置:直接將 libmytest.so 文件拷貝到 /usr/lib/【/lib】目錄下。(受 libc 庫的啓發)
    4. 將 libmytest.so 所在絕對路徑追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新

(2)實際操作

  • 生成 .o 目標文件,文件路徑和內容同上,進入到 src 目錄,生成 .o 目標文件:
    在這裏插入圖片描述
  • 將 .o 文件打包生成動態庫
    在這裏插入圖片描述
  • 使用生成的動態庫,-L 指定動態庫路徑 -l 指定庫名
gcc main.c -o main -I include/ -L ./lib -lCalc
  • 退出到 dongtai 目錄下,將動態庫拷貝到 lib 目錄下並編譯 main.c 並執行 main:
    在這裏插入圖片描述
    無法找到動態庫目標文件,解決方法有三個:

(1)拷貝到 /lib 下(不允許,容易與別人庫命名重合)
在這裏插入圖片描述
(2)將庫路徑增加到環境變量 LD_LIBRARY_PATH 中(不是特別推薦)
在這裏插入圖片描述
(3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路徑,執行 ldconfig -v,並執行 main
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

四、動態庫

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章