C語言函式篇(五)靜態庫和動態庫的建立和使用
阿新 • • 發佈:2018-12-08
使用庫函式是原始碼的一種保護?我猜的.
庫函式其實不是新鮮的東西,我們一直都在用,比如C庫.
我們執行pringf() 這個函式的時候,就是呼叫C庫的函式.
下面記錄靜態庫和動態庫的生成和使用.
靜態庫:libxxx.a
動態庫:libxxx.so
靜態庫: 在程式編譯的時候,將庫編譯進可執行程式中, 執行的時候不需要外部函式庫
動態庫: 在程式執行的時候,將庫載入到程式中,執行的時候需要外部函式庫
函式庫的目錄有 /lib 和 /usr/lib 和 自定義
標頭檔案是庫檔案的輔助,標頭檔案就像是目錄一樣,介紹了這個庫檔案有哪些函式可以被呼叫.
下面通過一個簡單的小栗子來介紹庫函式怎麼生成和使用.
1.庫函式的原始碼 hello.c
#include "stdio.h" int hello(void){ printf("hello lib"); return 0; }
2. 庫函式的標頭檔案 hello.h
#ifndef __HELLO_H #define __HELLO_H int hello(void); #endif
庫檔案的標頭檔案是庫檔案的目錄,因為庫檔案是保護的,看不到裡面的原始碼,所以把函式介面通過標頭檔案來讓人呼叫 .
這樣就實現了介面,也保護了原始碼
3.編譯靜態庫函式
3.1 將 hello.c 編譯成目標檔案 生成 hello.o檔案
gcc -c hello.c
3.2 將.o檔案打包成靜態庫 生成 libhello.a庫檔案
ar -cr libhello.a hello.o
4 使用靜態庫,因為靜態庫是在編譯的時候一起打包程序序的,所以如果編譯的時候沒有靜態庫檔案,則無法編譯
4.1 main.c 寫一個main函式來呼叫庫函式
#include "hello.h" //引入庫函式的標頭檔案,這樣才能找到函式宣告 int main{ hello();//呼叫庫函式 }
正常編譯的時候是沒辦法通過的. 因為編譯器找不到 hello() 的實現程式碼
如圖:
所以在編譯的時候要加入庫引用
gcc -c main -L. -lhello -o a.out
-L<路徑> 引用自定義庫的路徑,如果呼叫系統庫就不用-L '.'表示當前資料夾
-lxxxx 這裡libhello.a 只要寫hello 就可以 //小寫的L