makefile的寫法 一

2021-07-13 11:17:30 字數 2743 閱讀 2213

linux中使用g++的方法:

第一步預處理:

g++ -e test.cpp -o test.i

-o :表示輸出的專案 該部處理將巨集,typedef等處理替換 結果是  .i 檔案

1.預處理-pre-processing

gcc -e test.c -o test.i   //.i檔案

第二步編譯:

g++ -s test.i -o test.s 結果是 .s檔案

2.編譯-compiling

gcc -s test.i -o   test.s //.s檔案

第三步彙編:

g++ -c test.s -o test.o 結果是 .o檔案

3.彙編-assembling       //.o檔案

gcc -c test.s -o test.o

生成 可執行檔案沒有字尾名

g++ test.o -o test//c++

4.鏈結-linking       //bin檔案

gcc test.o -o test//c

一些其他的引數:

-g  :

6)除錯選項-g和-pg

gcc 支援數種除錯和剖析選項,常用到的是 -g 和 -pg 。

-g 選項告訴 gcc 產生能被 gnu 偵錯程式使用的除錯資訊以便除錯你的程式。gcc 提供了乙個很多其他 c 編譯器裡沒有的特性, 在 gcc 裡你能使-g 和 -o (產生優化**)聯用

新增  -g 才可以除錯。

-l :新增庫。

-l引數和-l引數

-l引數就是用來指定程式要鏈結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?

就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。

如:**如下: gcc ***.c   -lm( 動態數學庫)

-lpthread

好了現在我們知道怎麼得到庫名了,比如我們自已要用到乙個第三方提供的庫名字叫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`。

推薦一篇部落格,makefile的書寫

makefile的簡單寫法

makefile 使用方法 vi 乙個makefile檔案 cc g 指的是用什麼編譯器 rm rm rf 定義乙個刪除的指令 變數 cflags c wall i.d debug 編譯標誌 冒號左邊是目標,右邊是依賴 client main.o client.o logreader.o conso...

通用的makefile寫法

1 定義可執行檔案的名稱 target mypro 2 指定此編譯工程所要使用的標頭檔案所在的目錄 inc i.iheader1 iheader2 3 指定cpp檔案所在的目錄 vpath src1 src2 4 指定所有的cpp檔案 src path foreachdir,subst vpath ...

常見makefile寫法

1 目標名稱,擺脫手動設定目標名稱 cpp view plain copy target notdir curdir all target cmd.curdir 表示makfile當前目錄全路徑 notdir path 表示把path目錄去掉路徑名,只留當前目錄名 這樣就可以得到makefile當前...