下圖框起來的部分是在整個程式從編譯到執行的過程中,打包靜態函式庫或者連結動態函式庫的位置。
[](https://hackmd.io/_uploads/Syq8wJcYh.png)
# 簡單介紹

## 靜態函式庫
- 檔名:lib*.a
- 會==把library包進程式中==,執行時不需要再依賴其他library檔案,但是會導致程式比較肥大,函式庫只要有改動就要整個程式重新編譯。
## 動態函式庫
- 檔名:lib*.so
- 主程式中==只有記錄簡單的參考位置==,執行時期再呼叫使用。更換新的動態函式庫時,主程式大部分是不需要重新編譯。但相依的檔案若不存在就無法執行。檔案數量多。
## 優缺點比較
| | Static library (靜態)| Shared library (動態)|
| -------- | -------- | -------- |
|優點|不需要考慮執行環境的相依性問題|使用空間小(檔案和記憶體)、更換library不用重build|
|缺點| 執行檔極大、更換library需重build| 在異地執行可能會因為相依性無法執行|
---
參考網址:
:::warning
這個網站 [淺談函式庫](https://evshary.com/2018/05/12/%E6%B7%BA%E8%AB%87%E5%87%BD%E5%BC%8F%E5%BA%AB/) 有很詳盡的編譯步驟跟名詞解釋,推薦閱讀!
:::
> [使用 gcc 自製 C/C++ 靜態、共享與動態載入函式庫教學](https://blog.gtwang.org/programming/howto-create-library-using-gcc/)
[C 語言 static 和 shared 函式庫](https://aben20807.blogspot.com/2018/08/1070825-c-static-shared.html)
[靜態函式庫.a 共享與動態函式庫.so](https://2formosa.blogspot.com/2018/03/comparison-between-static-and-dynamic-libraries.html)
[C语言gcc编译器和静动态库](https://zhuanlan.zhihu.com/p/557094863)
---
# 其他補充
## Linux 的 .a / .so / .la 函式庫的差異
* .o (obj file) 是目標物件函式庫, 等同於 Windows 的 .obj
* .a 為靜態函式庫, 可以是 一個 或 多個 .o 合在一起, 用於靜態連結
* .la 為 libtool 生成的共享函式庫, 其實是個設定的檔案. 可以用 file 代替
* .la 可用 vi 來查看
* .so 為動態函式庫, 類似 Windows 的 DLL(Dynamic-link library)檔.
* 補充: 還有一種附檔名為 .ko 的檔案, 不過它是 Linux 核心使用的動態連結文件, 屬於模組程式, 用來在 Linux 系統啟動時, 加掛核心模組用.
## .o, .a, .so, .la 如何產生
* 建立 .o
$ gcc -c test.c
* 建立 .a
$ ar -r libtest.a test1.o test2.o
* 建立動態函式庫 .so
$ gcc -Wall -fpic -shared test1.c test2.c -o libtest.so
* 鍊結函式庫
$ gcc -Wall -fpic -shared -Ltest test3.c -o libtest.so
* 建立 .la, .la 一般會使用 Makefile 產生, 可以透過下述命令產生:
$ libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la