---
# System prepended metadata

title: 編譯 Library
tags: [C Programming]

---

# Compile Library

## Static Library

### Create Object File

把所有程式碼都編譯成 object file
```cmake
gcc *.c -c
```

### Create Static Library

用 `ar` 指令把所有 object file 連結成一個 library

```cmake
ar rcs libmy_lib.a *.o
```
- `libmy_lib.a` 是輸出的檔案名稱
- 指令中的選項
    - `r`: (replacement) 把參數中所有的檔案插入 library 檔案中，若該檔案已存在於 library 中，覆蓋掉原本的內容
    - `c`: (create) 新增一個 library 檔案
    - `s`: (indexing) 在 library 中寫入 object-file 的 index

[GNU `ar` 文件](https://linux.die.net/man/1/ar)

## Shared Library

### Create Object for Shared Library

- 為了支援動態載入，編譯 object file 時要加入 `-fpic`
    ```
    gcc *.c -c -fPIC
    ```

### Create Shared Library

- 用 `gcc` 連結 object file
    ```
    gcc -shared *.o -o libmy_lib.so
    ```
    - `libmy_lib.so` 是輸出的檔案名稱
