(Linux之初學篇)關於Linux動態庫、靜態庫調用解讀

一、當前目錄文件情況,我已把文件清空

二、我現在建立三個  .c文件(其中兩個爲調用方法,一個爲main.c),一個頭文件

/*file1.c*/

#include"stdio.h"  // ""表示在函數編譯時會先找我們當前所寫C語言的路徑的庫,<>會直接從系統找庫

void file1(){

   printf("這是函數一的輸出\n");// 不要加return 0, 該函數返回類型爲空

}

/*file2.c*/

 

#include"stdio.h"  // ""表示在函數編譯時會先找我們當前所寫C語言的路徑的庫,<>會直接從系統找庫

void file2(){

   printf("這是函數二 的輸出\n");// 不要加return 0, 該函數返回類型爲空

}

/*main.c*/

#include"stdio.h

int main(){

   printf("我正在調用兩個函數\n");

   file1();

   file2();

   printf("函數調用完畢\n");

   return 0;

}

三、目錄文件顯示

先直接編譯執行main.c,黃字表示鏈接錯誤,因爲它沒找到庫

四、我們來生成動態庫和靜態庫

第一步:現將  .c文件轉成  .o(二進制文件)

gcc -c file1.c -o file1.o

gcc -c file2.c -o file2.o

第二步生成庫

動態庫生成方法

gcc -shared -fpic -o libpf.so file1.o file2.o

靜態庫生成方法

ar -cr libpf.a file1.o file2.o

目錄顯示

在動態庫、靜態庫同時存在的情況下 ,函數優先執行動態庫。那麼動態庫、靜態庫有什麼區別?

靜態庫是在編譯時寫進執行函數內,動態庫是執行時調用(需要給出找尋路徑,一般默認爲系統庫),

所以前者寫出的文件特別大,後者比較小。如果一個庫改變,前者需要重新編譯全部,後者僅編譯改動的庫即可。

下面我們看執行動態庫的情況

爲什麼還出現報錯?上文我們說明了,動態庫執行是要從系統庫裏查找,我們把動態庫放到系統庫裏試下(我的電腦是在/lib)

靜態庫的調用就比較簡單了,直接gcc -L. -lpf -o test2 

如果不想把動態庫放進/lib ,可以採取export LD_LIBRARY_PATH=:'pwd'

大家有什麼想法可留言(限新手),後續我會繼續寫更多文章,本人也是初學Linux幾個月,

如有不足請各位多多指點。

 

 

 

 

 

 

 

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