linux下的靜態庫和動態庫

動態庫與靜態庫的區別

         靜態庫:linux下的靜態庫是以xxx.a文件形式存在的。它類似於windows下的xxx.lib文件,在項目編譯的時候它會同項目一起編譯到項目的可執行文件中去,所以編譯出來的可執行文件會比較大。並且,如果後期對靜態庫稍加改動的話,需要重新編譯整個項目。

      動態庫:linux下的動態庫是以xxx.so文件形式存在的。它類似於windows下的xxx.dll文件,它是在程序運行過程中動態加載進去的,他比較靈活,後期要改動該動態庫的時候,不需要重新編譯整個工程,只需要將新編譯得到的動態庫覆蓋原先的即可。

 

GCC編譯生成和使用靜態庫

        1.編寫我們需要編譯成靜態庫的C源文件

            static_lib_test1.c 

#include<stdio.h>

void print1()
{
	printf("This is static_lib_test1!\n");
}

            static_lib_test2.c

#include<stdio.h>

void print2()
{
	printf("This is static_lib_test2!\n");
}

 

        2.使用GCC編譯我們的C源文件,獲得static_lib_test1.o,static_lib_test2.o文件

root@ubuntu:~/job/libtest# gcc -c static_lib_test*.c

 

        3.使用ar指令編譯獲得我們需要的xxx.a靜態庫文件

root@ubuntu:~/job/libtest# ar r libtest.a static_lib_test*.o
ar: creating libtest.a

       

        4.編寫我們需要的測試代碼

            static_main.c

#include<stdio.h>

int main(void)
{
	printf("This is main functiondd!\n");
	print1();
	print2();
	return 1;
}


        5.鏈接靜態庫,編譯生成可執行文件,-L指定庫文件所在的路徑,否則編譯器無法找到,-l指定靜態庫

root@ubuntu:~/job/libtest# gcc -o main static_main.c -L. -ltest

 

        6.然後執行可執行文件,即可看到我們需要的效果,成功調用靜態庫的內容。

root@ubuntu:~/job/libtest# ./main 
This is main functiondd!
This is static_lib_test1!
This is static_lib_test2!



GCC編譯生成和使用動態庫

        1.前期操作跟上面沒啥區別,我們主要需要了解的是如何生成動態庫。

        2.使用GCC指令生成動態庫文件libxxx.so

root@ubuntu:~/job/libtest# gcc static_lib_test*.c -fPIC -shared -lpthread -o libtest.so

            其中-shared參數是指明編譯生成靜態庫;

                  -fPIC 表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的;

        3.最後編譯運行測試程序即可。

root@ubuntu:~/job/libtest# gcc -o main static_main.c -L. -ltest
root@ubuntu:~/job/libtest# ./main 
This is main functiondd!
This is static_lib_test1!
This is static_lib_test2!

        注意:此時直接編譯可能會出現error while loading shared libraries: libXXX.so: cannot open shared object file: No such file or directory的錯誤,說的是找不到我們自己的鏈接庫,這又幾種解決方案:

        (1)設置環境變量,將我們的鏈接庫所在的目錄添加進LD_LIBRARY_PATH環境變量中:export LD_LIBRARY_PATH=/root/job/socket_lib/:$LD_LIBRARY_PATH

        (2)編輯/etc/ld.so.config文件,將我們的庫文件目錄添加進去,然後執行ldconfig進行更新ld.so.cache即可。

        (3)在/etc/ld.so.conf.d目錄下新建一個xxx.conf文件,將庫文件所在目錄添加進去,執行ldconfig即可。

 

 


 

發佈了36 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章