首先說明一下頭文件、庫文件、庫函數這三個概念的區別。頭文件:即後綴為.h的文件,在其中對變量和函數原型進行了聲明。庫文件:提供有庫函數的文件。一種是靜態連接的後綴為.a的文件,在程序編譯時連接;一種是共享庫,文件後綴為.so,在程序運行的時候才進行連接。庫函數:在庫文件裡提供的函數。
下面,我們用一個實例介紹一下Linux下怎麼樣創建庫文件以及怎麼樣應用庫文件。
文件1: mymath.h
#ifndef MYMATH_H
#define MYMATH_H
int xiangjia(int a,int b);
int xiangjia(int a,int b);
#endif
文件2:xiangjia.c
int xiangjia(int a,int b)
{
return a+b;
}
文件3:xiangjian.c
int xiangjian(int a,int b)
{
return a-b;
}
文件4:main.c
#include "mymath.h"
#include “stdio.h”
int main()
{
printf(“%d”,xiangjia(65,45));
printf(“%d”,xiangjian(65,45));
return 0;
}
無論動態庫還是靜態庫都需要用到.o文件來生成,先編譯生成.o文件。
# gcc -c xiangjia.c xiangjia.c main.c
一、創建靜態庫
靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為math56,則靜態庫文件名就是libmath56.a。
# ar cr libmath56.a xiangjia.o xiangjian.o
鏈接靜態庫,生成可執行文件:
#gcc –o math main.o libmath56.a
或者 # gcc –o math main.c –L. –lmath56
執行:
# ./math
110
20
二、利用.o文件創建動態庫
動態庫文件擴展名為.so,使用下面的命令可以生成l ibmath56.so文件。
# gcc -shared -fPCI -o libmath56.so xiangjia.o xiangjia.o
生成可執行文件math2
# gcc –o math2 main.c -L. –lmath56
執行:
# ./math
./math: error while loading shared libraries: libmath56.so: cannot open shared object file: No such file or directory
嘔哦,出錯了!快看看錯誤提示,原來是找不到共享庫文件libmath56.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。
如何找到生成的動態庫有3種方式:
1)把庫拷貝到/usr/lib和/lib目錄下。
(2)在LD_LIBRARY_PATH環境變量中加上庫所在路徑。
例如動態庫libhello.so在/home/example/lib目錄下:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
(3) 修改/etc/ld.so.conf文件,把庫所在的路徑加到文件末尾,並執行ldconfig刷新。這樣,加入的目錄下的所有庫文件都可見。
當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。