gcc 怎麼鏈結外部庫

2021-06-19 15:31:19 字數 1393 閱讀 6236

庫是預編譯的目標檔案(object files)的集合,它們可被鏈結程序式。靜態庫以後綴為『.a』的特殊的存檔檔案(archive file)儲存。

標準系統庫可在目錄/usr/lib/lib中找到。比如,在類 unix 系統中 c 語言的數學庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案/usr/include/math.h中。c 標準庫本身儲存為/usr/lib/libc.a,它包含 ansi/iso c 標準指定的函式,比如『printf』。對每乙個 c 程式來說,libc.a 都預設被鏈結。

下面的是乙個呼叫數學庫libm.asin函式的的例子,建立檔案calc.c

#include #include int main (void)

$ gcc -wall calc.c -o calc

/tmp/ccbr6ojm.o: in function 'main':

/tmp/ccbr6ojm.o(.text+0x19): undefined reference to 『sin』

函式sin,未在本程式中定義也不在預設庫『libc.a』中;除非被指定,編譯器也不會鏈結『libm.a』。

$ gcc -wall calc.c /usr/lib/libm.a -o calc
函式庫『libm.a』包含所有數學函式的目標檔案,比如sin,cos,exp,logsqrt。鏈結器將搜尋所有檔案來找到包含sin的目標檔案。

$ ./calc

the value of sin(2.0) is 0.909297

可執行檔案包含主程式的機器碼以及函式庫『libm.a』中sin對應的機器碼。

為避免在命令列中指定長長的路徑,編譯器為鏈結函式庫提供了快捷的選項『-l』。例如,下面的命令

$ gcc -wall calc.c -lm -o calc
與我們上面指定庫全路徑『/usr/lib/libm.a』的命令等價。

一般來說,選項-lname使鏈結器嘗試鏈結系統庫目錄中的函式庫檔案libname.a。乙個大型的程式通常要使用很多-l選項來指定要鏈結的數學庫,圖形庫,網路庫等。

gcc鏈結外部函式庫,比如數學函式庫

庫是預編譯的目標檔案 object files 的集合,它們可被鏈結程序式。靜態庫以後綴為 a 的特殊的存檔檔案 archive file 儲存。標準系統庫可在目錄 usr lib與 lib中找到。比如,在類 unix 系統中 c 語言的數學庫一般儲存為檔案 usr lib libm.a。該庫中函式...

gcc使用 動態庫鏈結靜態庫

最近自己的專案中遇到乙個問題 編譯乙個動態庫,動態庫中使用了靜態庫的函式如下圖所述 問題來了怎麼編譯最終得到乙個帶有靜態鏈結的動態庫lib so?生成靜態庫lib 1 gcc o 1.o c 1.c ar r 1.o lib 1.a 生成靜態庫lib 2 gcc o 2.o c 2.c ar r 2...

GCC 生成動態鏈結庫

linux 下動態鏈結庫 shared object file,共享物件檔案 的檔案字尾為.so,它是一種特殊的目標檔案 object file 可以在程式執行時被載入 鏈結 進來。使用動態鏈結庫的優點是 程式的可執行檔案更小,便於程式的模組化以及更新,同時,有效記憶體的使用效率更高。如果想建立乙個...