GNU GCC查詢路徑

2021-04-22 17:50:35 字數 4266 閱讀 4040

1.標頭檔案

gcc 在編譯時如何去尋找所需要的標頭檔案 :

header file的搜尋會從-i開始

然後找gcc的環境變數 c_include_path,cplus_include_path,objc_include_path

再找內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

庫檔案但是如果裝gcc的時候,是有給定的prefix的話,那麼就是

/usr/include

prefix/include

prefix/***-***-***-gnulibc/include

prefix/lib/gcc-lib/***x-***-***-gnulibc/2.8.1/include

2.庫檔案

cos()等函式庫的選項要多加 -lm

編譯的時候:

gcc會去找-l

再找gcc的環境變數library_path

再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的

-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`

每個方法編譯成乙個.o檔案,譬如printf.o,scanf.o等等。靜態庫(static library)就是這樣乙個解決方案。靜態庫是乙個或多個.o檔案的集合。程式設計師使用到這些.o檔案對應的函式時,只需要在連線時提供該靜態庫即可,而不需要列舉用到的.o檔案。而聯結器進行連線的時候,只會將程式中用到的函式對應的.o檔案連線到程式中。譬如,我們有乙個庫檔案libc.a,裡面放有 printf.o,scanf.o等多個.o檔案,如果我們程式中只使用了printf函式,那麼,聯結器只會將printf.o連線進來,而不會把 scanf.o也連線進來,雖然它們都同在乙個庫檔案中。這樣,計算機和程式設計師都滿意了。是使用靜態庫的示例:

靜態庫是在編譯階段跟應用**連線在一起的,從那以後,兩者就緊密耦合在一起。這樣一來,應用**中庫檔案的更新就成了大問題了。如果庫檔案更新了,我想在應用程式中使用到最新的靜態庫,那麼,我只能夠將我的**跟新的靜態庫重新編譯一次,很難維護。此外,靜態庫的性質使每乙個應有程式都有靜態庫中相應部分的拷貝,譬如,程式a和b都用到了printf函式,那麼在兩個程式中都會有printf.o拷貝。如果系統中有好幾十個程序都使用到了printf函式,那麼相同的**將會重複出現幾十次,這對於記憶體是極大的浪費。針對這些問題,共享庫 (shared library,也叫做動態連線庫,*nix中為so檔案,windows中稱為dll)誕生了。使用該技術,乙個共享庫只會在系統中出現一次,而不管系 統中有多少個程序使用到這個共享庫。同時,共享庫中的**段還可以被各個程序所共享。共享庫的示例圖:

共享庫是在應用**裝載到系統中的時候由動態聯結器動態載入到記憶體空間去的。靜態聯結器在編譯階段只是在應用**中插入一些關於共享庫的基本資訊,而不會 將共享庫的實際**連線到應用**中去。這樣,如果庫檔案更新了,我們只需要重新啟動應用程式,就可以使用到最新的庫檔案了,同時,我們還大大節省了內 存,一舉兩得。

現在,一切都那麼美好,但是並非完美。現在的情況是在載入過程中我們會把應用**中的使用到共享庫動態載入到系統中,但是,這個庫在實際執行過程中會被使用到嗎?看下面例子:

void show(int cmd)

} 如果傳入的引數不等於 0 的話,libraay method是永遠都不會執行的,但是,我們卻會把這個共享庫載入到系統中去。如果我們能夠在執行過程中決定是否載入乙個共享庫,那該多好啊!完全可 以,linux以及相關系統我們提供了相關的api,這些api包含在標頭檔案中。相關的函式有:

void *dlopen(const char *filename, int flag);

void *dlsym(void *handle, char *symbol);

int dlclose (void *handle);

const char *dlerror(void);

在vc,也有相應的函式完成相關功能。此外,vc中還有延遲載入技術,使得dll可以按需載入。

24 模板查詢路徑

在專案的settings.py檔案中,有乙個templates的配置,這個配置包含了模板引擎的配置,模板查詢路徑的配置,模板上下文的配置等,模板路徑可以在兩個地方配置。dirs 這是乙個列表,在這個倆表中可以存放所有的模板路徑,以後在檢視函式中使用了render或者是render to string...

回溯法查詢路徑

題目描述 請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 begin a b c e s f c s a d e ...

makefile 標頭檔案查詢路徑

0.前言 從學習c語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫乙個makefile總覺得非常吃力。所以特意借助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。1.只有單個c檔案 2.含有多...