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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!