linux系統--靜態庫/共享庫(動態庫)

1基本概念

1作用

  • 分離編譯
  • 代碼重用

2動態庫和靜態庫的區別

  • 靜態庫:
    • 在可執行程序運行前就加入到執行碼中,成爲執行程序的一部分
    • 一個或多個.o目標文件歸檔在一個文件中
    • 對空間要求較低,而對時間要求較高的核心程序中
      在這裏插入圖片描述
  • 動態庫:
    • 在可執行程序運行啓動時加入到執行程序中,可以被多個可執行程序共享使用
    • 沒有main函數的可執行文件
    • 對時間要求較低,而對空間要求較高的
      在這裏插入圖片描述

2靜態庫的製作

2.1創建

  • 編譯源文件:生成靜態庫的材料
g++ -c -o test.o test.cpp
  • 生成靜態庫
ar -rcs libtest.a test.o //libtest.a是動態庫的名字
命令選項 作用
r 替換模塊(replace)
c 創建庫(create)
s 建立索引

在這裏插入圖片描述

2.2使用

  • 注意:庫一定要放在命令行的末尾

    • 鏈接靜態庫
g++ -o main main.cpp -L. -l庫民
g++ -o main main.cpp ./lib庫名.a

在這裏插入圖片描述

2.3函數的隱士聲明

  • 返回值類型只有int型,
  • 錯誤出現(因爲該文件編譯時還沒有連接庫,所以發現不了這些文函數,所以在文件中隱士聲明瞭這些函數)
    在這裏插入圖片描述
  • 解決方法:頭文件加聲明

2.4tar和ar都是歸檔工具

  • tar用於創建.tar歸檔文件。
  • ar用於創建歸檔文件,並且爲歸檔的目標文件中的符號建立索引。

3動態庫製作及使用

3.1創建

  • 編譯目標文件:生成製作動態庫的材料
g++/gcc -c test.cpp -o test.o -fPIC //(生成與位置無關的代碼 -fPIC)
  • 生成動態庫
g++/gcc -shared lib庫名.so text.o

在這裏插入圖片描述

3.2使用

  • 編譯可執行程序時,指定所使用的動態庫。-l:庫名 -L:指定庫路徑
gcc text.c -o a.out -lmymath -L./lib
  1. 運行可執行文件 ./a.out
    在這裏插入圖片描述

4動態庫加載錯誤願因和結局方法

  • 運行可執行文件 ./a.out:但是會出錯可是我給了位置和庫名,爲什麼還會出錯?:因爲動態鏈器器提供動態庫所在目錄位置,但是隻會在固定目錄尋找動態庫,如果找不到就報錯。
    在這裏插入圖片描述
    • 原因 (動態鏈接器報錯)
      • 鏈接器:工作於鏈接狀態,工作需要-l 和 -L
      • 動態鏈接器: 工作於程序運行時間。工作的時候需要提供動態庫所在目錄位置。
    • 改正方法
      • 臨時生效
        • 改變環境變量export LD_LIBRARY_PATH=./lib( 終端重啓環境變量實失效)
      • 永久生效方法1:
        • vim ~./bashrc(環境變量的配置文件)
        • 寫入 export LD_LIBRARYPATH=動態庫路徑
        • …bashrc/ source.bashrc /重啓 終端
      • 永久生效方法2:
        • 拷貝自定義動態庫 到/lib(標準C庫所在目錄中)
      • 永久生效方法3:
        • vim /etc/ld.so.conf
        • 寫入動態庫絕對路徑保存
        • sudo ldconfig -v使配置文件生效
        • ./a.out 成功

5注意點

  1. 當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。
  2. 查看執行文件鏈接的動態鏈接庫
ldd 可執行文件

在這裏插入圖片描述

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