ld命令和鏈結庫

2021-05-09 16:13:16 字數 2531 閱讀 5208

ld命令和鏈結庫

1 靜態連線庫的名稱是有約定的,也就是必須的:

以lib開頭,以 a 作為副檔名。

所以不可能有名為my.a的靜態庫。

如: 你的庫可以起名為 「 libmy.a 」(.so 應該是動態連線庫)

2 新增靜態連線庫:

如果,你生成的libmy.a在/usr/local/lib裡面

gcc -o myexe myexe.o -l/usr/local/lib -lmy

也可以寫成

gcc -o myexe myexe.o -l/usr/local/lib/libmy.a

-l 指定路經

-l 指定名稱

-----------------------------------

如果你的庫名是lib***x.a

那麼在你的gcc命令中加入 -l***(你的庫路徑) -l***x

否則 直接跟在gcc命令中原檔案後

----------------------------------

[ref:   gcc 命令列詳解 http://blog.csdn.net/casularm/archive/2005/03/09/316149.aspx]

4、-l引數和-l引數

-l引數就是用來指定程式要鏈結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了

好 了現在我們知道怎麼得到庫名,當我們自已要用到乙個第三方提供的庫名字libtest.so,那麼我們只要把libtest.so拷貝到/usr/lib 裡,編譯時加上-ltest引數,我們就能用上libtest.so庫了(當然要用libtest.so庫里的函式,我們還需要與libtest.so配 套的標頭檔案)

放在/lib和/usr/lib和/usr/local/lib裡的庫直接用-l引數就能鏈結了,但如果庫檔案沒放在這三個 目錄裡,而是放在其他目錄裡,這時我們只用-l引數的話,鏈結還是會出錯,出錯資訊大概是:「/usr/bin/ld: cannot find -l***」,也就是鏈結程式ld在那3個目錄裡找不到lib***.so,這時另外乙個引數-l就派上用場了,比如常用的x11的庫,它在/usr /x11r6/lib目錄下,我們編譯時就要用-l/usr/x11r6/lib -lx11引數,-l引數跟著的是庫檔案所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那鏈結引數就是-l /aaa/bbb/ccc -ltest

另外,大部分lib***x.so只是乙個鏈結,以rh9為例,比如libm.so它鏈結到/lib/libm.s

o.x,/lib/libm.so.6又鏈結到/lib/libm-2.3.2.so,

如果沒有這樣的鏈結,還是會出錯,因為ld只會找lib***x.so,所以如果你要用到***x

庫,而只有lib***x.so.x或者lib***x-x.x.x.so,做乙個鏈結就可以了

ln -s lib***x-x.x.x.so lib***x.so

手工來寫鏈結引數總是很麻煩的,還好很多庫開發包提供了生成鏈結引數的程式,名字一般叫***x-config,一般放在/usr/bin目錄下,比如

gtk1.2的鏈結引數生成程式是gtk-config,執行gtk-config --libs就能得到以下輸出"-

l/usr/lib -l/usr/x11r6/lib -lgtk -lgdk -rdynamic

-lgmodule -lglib -ldl -lxi -lxext -lx11 -lm",這就是編譯乙個gtk1.2程式所需的g

tk鏈結引數,***-config除了--libs引數外還有乙個引數是--cflags用來生成頭文

件包含目錄的,也就是-i引數,在下面我們將會講到。你可以試試執行gtk-config

--libs --cflags,看看輸出結果

現在的問題就是怎樣用這些輸出結果了,最笨的方法就是複製貼上或者照抄,聰明的辦

法是在編譯命令列裡加入這個`***x-config --libs --cflags`,比如編譯乙個gtk程式:gcc gtktest.c `gtk-config --libs --cflags`這樣

就差不多了。注意`不是單引號,而是1鍵左邊那個鍵。

除了***-config以外,現在新的開發包一般都用pkg-config來生成鏈結引數,使用方法

跟 ***-config類似,但***-config是針對特定的開發包,但pkg-config包含很多開發包的鏈結引數的生成,用pkg-config --list-all命令可以列出所支援的所有開發包,pkg-config的用法就是pkg -config pagname --libs --cflags,其中pagname是包名,是pkg-config--list-all裡列出名單中的乙個,比如gtk1.2的名字就是 gtk+,pkg-

config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一樣的。比如:

gcc gtktest.c `pkg-config gtk+ --libs --cflags`

ld 動態鏈結庫配置

一 ldconfig ldconfig是乙個動態鏈結庫管理命令,為了讓動態鏈結庫為系統所共享,還需執行動態鏈結庫的管理命令 ldconfig。ldconfig 命令的用途,主要是在預設搜尋目錄 lib和 usr lib 以及動態庫配置檔案 etc ld.so.conf內所列的目錄下,搜尋出可共享的動...

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...