靜態庫和共享庫-Linux/Unix

1 靜態庫
          靜態庫就是目標文件的集合,以.a結尾。靜態庫在程序鏈接的時候使用,鏈接器會將程序中使用到的函數的代碼從
  庫文件中拷貝到應用程序中去(a.out)。一旦鏈接完成,那麼在執行程序時就不需要該靜態庫了。由於每個使用靜
  態庫的應用程序(a.out)都需要拷貝所用函數的代碼,所以靜態鏈接的文件會比較大。
  1.1 靜態庫的創建
       1)編輯.c和.h文件
       2)編譯生產目標文件:gcc -c xxx.c -o xxx.o
                                             gcc -c yyy.c -o yyy.o
                                              ...
       3)打包成靜態庫文件:ar -r libxxxxxxxxx.a xxx.o yyy.o
                                              -r:將目標文件插入到靜態庫中,已存在則更新
  1.2 靜態庫的使用
      1)直接法
                        gcc xxx.c libxxxxx.a
      2)環境變量法
                        export LIBRARY_PATH=.:$LIBRARY_PATH
                        (聲明定義) 環境變量的名稱=.:原有值(取原有值只要在變量的前面加一個$符號)
                        gcc xxx.c -lxxxxx
      3)參數法
                        gcc main.c -lmy -L./
 
2 共享庫
          共享庫在程序鏈接時,並不像靜態庫那樣拷貝使用函數的代碼,而只是做一些標記,然後在程序啓動的時,動態加載所
  需要的共享庫。所以當應用程序運行時,任然需要共享庫的支持。共享庫鏈接出來的a.out要比靜態庫鏈接出來的a.out
  要小。
  2.1 共享庫的創建
     1)編輯.c .h
     2)編譯生成目標文件 gcc -c -fpic xxx.c -o xxx.o
                                        gcc -c -fpic yyy.c -o yyy.o
                                         ......
     3)鏈接生產共享庫文件 gcc -shared xxx.o yyy.o -o libxxxx.so
                                            gcc -shared -fpic xxx.c yyy.c -o libxxxx.so
  2.2使用共享庫
     1)直接法
                      gcc xxx.c libxxxxx.so
     2)環境變量法
                      export LIBRARY_PATH=.:$LIBRARY_PATH
                      (聲明定義) 環境變量的名稱=.:原有值(取原有值只要在變量的前面加一個$符號)
                      gcc xxx.c -lxxxxx
     3)參數法(推薦)
                      gcc main.c -lmy -L./
  2.3 運行
                      export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
                      LD_LIBRARY_PATH:指定共享庫加載目錄

  【總結】靜態庫佔用的空間大,不易修改,但執行效率高
                共享庫佔用的空間小,易於修改,但執行效率低
  
    需要使用的命令:
        ar:打包
        nm:可以查看目標文件(.o)、可執行文件(a.out)、靜態庫文件(.a)、共享庫文件(.so),他們中的所有的符號
        ldd:可以用來查看可執行文件(a.out)和共享庫文件(.so)的動態依賴
        objdump:顯示二進制模塊的彙編信息(查看代碼的執行效率)

發佈了22 篇原創文章 · 獲贊 0 · 訪問量 4610
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章