編譯時如何使用庫 zz

2021-09-09 04:00:42 字數 1748 閱讀 2386

-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.so.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程式所需的gtk鏈結引數,***-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`。

zz 如何使用try,catch, throw

經驗分享,如何使用try,catch,throw之一 try,catch,throw的含義就很清楚,但怎麼使用,我還是過了好多年才明白一些 先看乙個不好的例子 c c code 不好的 class ctest1 class ctest2 class ctest3 void badcode new c...

gcc編譯使用hal庫時重定向printf 函式

gcc編譯使用hal庫時重定向printf 函式 1.使用stm32cubemx配置好對應的串列埠 2.新建usart debug.h的標頭檔案和usart debug.c檔案,並新增到工程裡面 以下為usart debug.h 使用說明 使用標準庫重定向printf 函式 1.配置串列埠和串列埠h...

VS編譯時使用 去除NuGet管理庫

之前一直使用nuget來管理一些第三方的庫,但是每次check in 時候為了保證編譯通過,都需要把對應的packages check in。比較耗費時間,特別是往github上同步 而且這些庫在nuget上都有的,是沒有必要check in上去的。二 設定啟用nuget restore功能 在so...