1. 程式人生 > >C語言函式篇(五)靜態庫和動態庫的建立和使用

C語言函式篇(五)靜態庫和動態庫的建立和使用

使用庫函式是原始碼的一種保護?我猜的.

庫函式其實不是新鮮的東西,我們一直都在用,比如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