庫:是一組預先編譯好的函數的集合,linux中標準系統庫文件通常存儲在/lib和/usr/lib目錄中 linux
靜態庫:在程序編譯過程當中,就被連接到了程序編寫者所寫的源代碼中,靜態庫以.a結束。 數組
共享庫:在程序運行時載入,編譯時只需說明所須要的共享庫文件便可。共享庫以.so接受。 函數
頭文件:用於保存程序的聲明。 開發
makefile文件:makefile帶來的好處就是——「自動化編譯」,一旦寫好各文件的依賴項及其編譯方式,只須要一個make命令,整個工程徹底自動編譯,極大的提升了軟件開發的效率。 自動化
一.共享庫示例: io
一、在bill.h頭文件中,寫函數求數組最大元素的函數聲明; 編譯
$ more bill.h
int bill(int a[], int n); 效率
二、在bill.c文件中引入頭文件,寫該函數的實現;
$ more bill.c
#include "bill.h"
int bill(int a[], int n)
{
int i,max = a[i];
for( i = 0; i < n; ++i)
{
if( max < a[i])
{
max = a[i];
}
}
return max;
}
三、在main.c中寫主程序內容,調用該函數,此時,須要引入頭文件
$ more main.c
#include <stdio.h>
#include "bill.h"
int main()
{
int MAX;
int ar[10] = {1,23,21,34,45,56,57,48,90,100};
MAX = bill(ar,10);
printf("%d\n",MAX);
return 0;
} 變量
四、編譯共享庫以及main.c;
$ gcc -shared -fPIC bill.c -o libbill.so gcc
結果以下:
$ ls
bill.c bill.h libbill.so main.c
五、設置環境變量(未設置環境變量,則系統只在默認的標準路徑下尋找共享庫,設置了環境變量以後,則系統首先在環境變量指定的路徑下尋找共享庫)
/*此環境變量的設置只是對於共享庫而言*/
$ export LD_LIBRARY_PATH=./
六、編譯生成可執行程序/* 其中-L.表示庫文件的查找路徑爲當前路徑(.),-lbill表示所要使用的文件共享庫文件名爲bill
頭文件因爲處於當前路徑,故能夠省略不寫,當處於系統標準路徑時也可省略不寫*/
$ gcc -o main main.c -L. -lbill
七、編譯成功,執行main程序
$ ls
bill.c bill.h libbill.so main main.c
$ ./main
100
二.共享庫的makefile:
仍然上面爲例子:
一、上例中源代碼爲:
$ ls
bill.c bill.h main.c makefile
二、makefile文件以下:
$ more makefile
main: main.o libbill.so
export LD_LIBRARY_PATH=./
gcc -o main main.c -L. -lbill
main.o: main.c bill.h
gcc -c main.c
libbill.so: bill.c
gcc -shared -fPIC bill.c -o libbill.so
三、make的過程:
$ make
gcc -shared -fPIC bill.c -o libbill.so
export LD_LIBRARY_PATH=./
gcc -o main main.c -L. -lbill
4.執行結果爲:
$ ./main
100