GCC l選項 手動新增鏈結庫

2022-03-25 18:28:08 字數 1484 閱讀 4686

鏈結器把多個二進位制的目標檔案(object

file)鏈結成乙個單獨的可執行檔案。在鏈結過程中,它必須把符號(變數名、函式名等一些列識別符號)用對應的資料的記憶體位址(變數位址、函式位址等)替代,以完成程式中多個模組的外部引用。

而且,鏈結器也必須將程式中所用到的所有c標準庫函式加入其中。對於鏈結器而言,鏈結庫不過是乙個具有許多目標檔案的集合,它們在乙個檔案中以方便處理。

當把程式鏈結到乙個鏈結庫時,只會鏈結程式所用到的函式的目標檔案。在已編譯的目標檔案之外,如果建立自己的鏈結庫,可以使用 ar 命令。

標準庫的大部分函式通常放在檔案 libc.a 中(檔名字尾.a代表「achieve」,譯為「獲取」),或者放在用於共享的動態鏈結檔案 libc.so 中(檔名字尾.so代表「share

object」,譯為「共享物件」)。這些鏈結庫一般位於 /lib/ 或 /usr/lib/,或者位於 gcc 預設搜尋的其他目錄。

當使用 gcc 編譯和鏈結程式時,gcc 缺省會鏈結 libc.a 或者 libc.so,但是對於其他的庫(例如非標準庫、第三方庫等),就需要手動新增。

令人驚訝的是,標準標頭檔案

對應的數學庫預設也不會被鏈結,如果沒有手動將它新增進來,就會發生函式未定義錯誤。

gcc 的-l選項可以讓我們手動新增鏈結庫。下面我們編寫乙個數學程式 main.c,並使用到了 cos() 函式,它位於 標頭檔案。

#include

/*printf

*/#include

/*cos

*/#define pi 3.14159265

intmain ()

$ gcc main.c -o main.out -lm

數學庫的檔名是 libm.a。字首lib和字尾.a是標準的,m是基本名稱,gcc 會在-l選項後緊跟著的基本名稱的基礎上自動新增這些字首、字尾,本例中,基本名稱為 m。

在支援動態鏈結的系統上,gcc 自動使用在 darwin 上的共享鏈結庫 libm.so 或 libm.dylib。

鏈結其它目錄中的庫

1) 把鏈結庫作為一般的目標檔案,為 gcc 指定該鏈結庫的完整路徑與檔名。

例如,如果鏈結庫名為 libm.a,並且位於 /usr/lib 目錄,那麼下面的命令會讓 gcc 編譯 main.c,然後將 libm.a 鏈結到 main.o:

$ gcc main.c -o main.out /usr/lib/libm.a

2) 使用-

l選項,為 gcc 增加另乙個搜尋鏈結庫的目錄:

$ gcc main.c -o main.out -l/usr/lib -lm

可以使用多個-l選項,或者在乙個-l選項內使用冒號分割的路徑列表。

3) 把包括所需鏈結庫的目錄加到環境變數 librarypath 中。

GCC l選項 手動新增鏈結庫

最近研究c語言crc迴圈冗餘校驗,找到乙個開源的庫 lammertb libcrc 其中有例項 但是無論如何執行不起來,報錯如下 root frytea dev test examples gcc tstcrc.c o tstcrc l libcrc include tmp ccecajcy.o i...

手動載入動態鏈結庫

手動載入動態鏈結庫常用於外掛程式式架構開發 dlfcn.h標頭檔案提供了api 以下我們給出常用的4個函式 open the shared object file and map it in return a handle that can be passed to dlsym to get sym...

cmake新增動態鏈結庫

如果使用gcc進行單個c檔案編譯的時候,有時候後面會需要新增如 l l之類的引數,如下 gcc o test test.c l usr local lib lopencv 這裡 l是制定動態庫的位置,l則是指定打算連線的動態庫名字。那麼在進行專案編譯的時候就需要通過cmake來通過cmakelist...