.so檔案是Linux下的程式函數庫,即編譯好的可以供其他程式使用的代碼和資料
linux下何謂.so檔案:1.
用過windows的同學應該都知道 .dll檔案吧, 這二者有什麼共通之處呢,其實 .so檔案就跟.dll檔案差不多.//
2.一般來說.so檔案就是常說的動態連結程式庫, 都是C或C++編譯出來的。與Java比較就是:它通常是用的Class檔案(位元組碼).//
3.Linux下的.so檔案時不能直接啟動並執行,一般來講,.so檔案稱為共用庫.//
4.那麼.so檔案是怎麼用的呢?
for example:(1)動態庫的編譯
這裡有一個標頭檔:so_test.h,三個.c檔案:test_a.c、test_b.c、test_c.c,我們將這幾個檔案編譯成一個動態庫:libtest.so。
命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
(參考2:都是由C或C++編譯出來的)
(-shared
該選項指定產生動態串連庫(讓連接器產生T類型的匯出符號表,有時候也產生弱串連W類型的匯出符號),不用該標誌外部程式無法串連。相當於一個可執行檔)
(-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正程式碼片段共用的目的。)
(2)動態庫的連結
這裡有個程式源檔案 test.c 與動態庫 libtest.so 連結產生執行檔案 test:
命令:$ gcc test.c -L. -ltest -o test
(註:測試是否動態串連,如果列出libtest.so,那麼應該是串連正常了)
(-L.:表示要串連的庫在目前的目錄中)
(-ltest:編譯器尋找動態串連庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱)
命令:$ ldd test
(註:執行test,可以看到它是如何調用動態庫中的函數的。)