linux下的庫有兩種:靜態庫和共享庫(動態庫)。二者的不同點在于代碼被載入的時刻不同。 靜態庫在程序編譯時會被連接到目標代碼中,目標程序運行時將不再需要該動態庫,移植方便,體積較大,但是浪費空間和資源,因為所有相關的對象文件與牽涉到的庫被鏈接合成一個可執行文件。 動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行時才被載入,因此體積較小,可以實現進程間的資源共享,甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制,另外將一些程序的升級變得簡單,但是在程序運行時需要動態庫存在.
在Linux中靜態庫均以.a為文件名后綴,動態庫均以.so為文件名后綴
首先先寫三個代碼,hello.h
#ifndef _HELLO_H#define _HELLO_Hvoid hello(const char* str);#endifhello.c#include<stdio.h>void hello(const char * str){ PRintf("hello %s/n",str);}test.c#include"hello.h"int main(){ hello("sgc"); return 0;}gcc生成靜態庫我們用gcc -o 來編譯test.c發現不能成功,因為test.c不能把hello.c里內容也一同編譯下面我們將hello.c用gcc -c 生成一個編譯文件
ls
生成了一個hello.o文件
下面我們用指令將hello.o生成一個靜態庫libmyhello.a文件,與庫文件中文件命名要統一
指令 ar -r libmyhello.a hello.o
ls后發現系統中多了一個libmyhello.a文件
執行
gcc -o test test.c libmyhello.a
生成test,執行./test
hello sgc
使用 ar -t libmyhello.a查看靜態庫libmyhello.a中包含的文件
hello.o
gcc生成動態庫
執行兩條命令
gcc -shared -fPIC -c hello.cgcc -shared -fPIC -o libmyhello.so hello.o
即可生成一個動態庫libmyhello.so
執行命令
gcc -o hello main.c -L. -lmyhello
生成hello文件
./hello后
hello sgc
新聞熱點
疑難解答