Linux-C動態庫與靜態庫的編譯與調用

Linux-C動態庫與靜態庫的編譯與調用

一、簡述

          記錄-Linux-C動態庫與靜態庫的編譯與調用。將實現某部分功能的代碼封裝成庫文件,以方便調用,或者是對代碼進行保護加密。應用場景:有時想將某代碼提供給別人用,但是又不想公開源代碼,這時可以將代碼封裝成庫文件。在開發中調用其他人員編寫的庫。

      動態庫特點:
        1,庫的代碼不會編譯進程序裏面,所以動態庫編譯的程序比較小。
        2,由動態庫編譯的程序依賴於系統的環境變量有沒有這個庫文件,沒有則運行不了。

     靜態庫特點:
        1,庫的代碼會編譯進程序裏面,所以靜態庫編譯的程序比較大
        2,由靜態庫編譯的程序不用依賴於系統的環境變量,所以環境變量有沒有這個庫文件,也可以運行。
 

二、動態庫的編譯與調用

       1、創建目錄:mkdir dynamic;進入dynamic目錄:cd dynamic;新建c文件:vi func.c

               

       2、編輯func.c內容如下,(記得保存)

              

       3、 將func.c編譯爲動態庫,編譯命令:

            gcc func.c -o func.o -c -fPIC
            gcc func.o -shared -o libfunc.so               (注其中libfunc.so,lib爲前綴,.so是後綴,中間func是庫的名字)

               

       4、 在dynamic路徑下新建main.c文件:vi main.c;在main.c中調用動態庫中的func()函數。

              

       5、    因爲fun.c與main.c在同一路徑,避免干擾,刪除fun.c,func.o文件;命令:rm func.c func.o

             

      6、    編譯main.c並調用動態庫libfunc.so。命令:gcc main.c -o main -L 庫的路徑 -l 庫名    

              gcc main.c -o main -L . -l func            (點代表當前路徑)

             

      7、   執行main,找不到庫

              

       8、 需要將動態庫拷貝一份到/usr/lib/路徑下,命令:sudo cp libfunc.so /usr/lib     (需要超級權限);執行:./main

              

三、靜態庫的編譯與調用

        1、創建目錄:mkdir static;進入static目錄:cd static;新建c文件:vi func.c

              

        2、編輯func.c內容如下,(記得保存)      

              

     3、 將func.c編譯爲靜庫,編譯命令:

            gcc func.c -o func.o -c 
            ar -crv libfunc.a func.o               (注lib爲前綴,靜態庫以.a爲後綴,中間部分func爲庫的名字)

            

     4、 在static路徑下新建main.c文件:vi main.c;在main.c中調用靜態庫中的func()函數。

            

     5、    因爲fun.c與main.c在同一路徑,避免干擾,刪除fun.c,func.o文件;命令:rm func.c func.o

           

     6、 編譯main.c並調用靜態庫libfunc.so。命令:gcc main.c -o main -L 庫的路徑 -l 庫名    

            gcc main.c -o main -L . -l func            (點代表當前路徑)

          

     7、執行:./main          (不需要將靜態庫拷貝到/usr/lib/)

          

   四、靜態編譯

        我們通常用的是動態編譯,比如說調用標準庫的printf()函數,printf()的代碼不會直接全部的編譯到可執行文件,而是相當於在可執行程序中鏈接調用printf()函數。這樣可執行文件的大小就不會很大,但是可執行程序的運行環境必需要含有其所需要的庫文件等。靜態編譯,就是將程序所調用到的代碼全部編譯到可執行文件,所以編譯出來的可執行文件比較大,但是它無需過多依賴運行環境。

        比如在桌面創建hello.c;命令:vi hello.c 。編輯內容如圖

        

        動態編譯:gcc hello.c -o hello_dynamic          靜態編譯:gcc hello.c -o hello_static -static

       
--------------------- 
作者:Genven_Liang 
來源:CSDN 
原文:https://blog.csdn.net/nanfeibuyi/article/details/81203021 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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