自己製作靜態/動態連結庫並使用
阿新 • • 發佈:2019-01-11
-
靜態連結庫
#vi mylib.c //編輯庫函式定義原始碼
#include <stdio.h>
void printfHello(void)
{
printf("Hello mylib\n");
}
int Max(int a,int b) //不知道為什麼在這裡加行內函數符連結時會報錯
{
return ((a>b)? a:b);
}
#vi Makefile //編寫makefile檔案
all: gcc mylib.c -o mylib.o -c //只編譯不連結 ar -rc libmylib.a mylib.o //建立.a歸檔檔案
# make
#ls
mylib.c mylib.o libmylib.a
#vi mylib.h //編寫庫函式宣告標頭檔案
void printfHello(void);
int Max(int a,int b);
#vi test.c //編寫測試程式
#include <stdio.h> #include "mylib.h" int main(void) { int a=2,b=3; int c=0; printfHello(); c=Max(a,b); printf("%d\n",c); return 0; }
#gcc test.c -o test -lmylib -L. //-L.當前檔案下查詢庫檔案
-
動態連結庫
#vi Makefile //編寫makefile檔案
all:
gcc mylib.c -o mylib.o -c -fPIC //只編譯不連結
gcc -o libmylib.so mylib.o -shared //建立.so動態庫檔案
//-fPIC是置位無關碼,-shareed是按照共享庫方式連結
動態連結庫執行時需要被載入,系統去固定目錄嘗試載入libmylib.so,需要將libmylib.so與這個固定目錄關聯,可以直接cp到
這個目錄下,但是這種方法不是最好
解決方法:使用環境變數LD_LIBRARY_PATH,作業系統在載入固定目錄/user/lib目錄之前回去LD_LIBRARY_PATH環境
變數所指定的目錄下去尋找。
- 將動態庫所在目錄匯出到LD_LIBRARY_PATH中
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chen/C/mylibrary/libtest
成功後可直接執行./test檔案
-
補充:
ldd命令檢視程式引用了哪些共享庫,是否解析成功。