鏈結器把多個二進位制的目標檔案(objectfile)鏈結成乙個單獨的可執行檔案。在鏈結過程中,它必須把符號(變數名、函式名等一些列識別符號)用對應的資料的記憶體位址(變數位址、函式位址等)替代,以完成程式中多個模組的外部引用。
而且,鏈結器也必須將程式中所用到的所有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...