通過vi創(chuàng)建一個(gè)add.h,并進(jìn)行編寫該文件,用來存放求和函數(shù)add()的聲明:
通過vi創(chuàng)建一個(gè)add.c文件,并進(jìn)行編寫,用來存放求和函數(shù)add()的實(shí)現(xiàn):
通過vi創(chuàng)建一個(gè)max.h,并進(jìn)行編寫該文件,用來存放求最大值函數(shù)max()的聲明:
通過vi創(chuàng)建一個(gè)max.c,并進(jìn)行編寫該文件,用來存放求最大值函數(shù)max()的實(shí)現(xiàn):
通過vi創(chuàng)建一個(gè)main.c,并進(jìn)行編寫該文件,用來實(shí)現(xiàn)求和函數(shù)add()和求最大值函數(shù)max()這兩個(gè)函數(shù)的功能:
(1)一步編譯
通過gcc -o main main.c add.c max.c
進(jìn)行編譯,生成可執(zhí)行文件main:
(2)兩步編譯
①先把.c文件轉(zhuǎn)換為二進(jìn)制指令.o文件
把a(bǔ)dd.c文件轉(zhuǎn)換為二進(jìn)制指令add.o文件;把max.c文件轉(zhuǎn)換為二進(jìn)制指令max.o文件;把main.c文件轉(zhuǎn)換為二進(jìn)制指令main.o文件:
②進(jìn)行鏈接,生成可執(zhí)行程序main
makefile文件中的內(nèi)容描述了如何編譯整個(gè)工程。makefile文件的作用是管理整個(gè)工程。 真正的makefile文件是通過工具生成的。makefile文件里面不用寫頭文件。為每個(gè)工程配上makefile文件,在編譯時(shí)只需make指令就可以完成編譯工作。
make指令會(huì)讀取makefile文件中的內(nèi)容,按照makefile文件編譯代碼。
(1)makefile文件的編寫
通過vi makefile
創(chuàng)建一個(gè)makefile文件:
在vi中編寫makefile文件:
假設(shè)現(xiàn)在要生成最終的可執(zhí)行文件main:
第一步:指定最終生成的可執(zhí)行程序main
格式:
all:main
第二步:寫可執(zhí)行程序main的依賴文件和依賴文件的編譯規(guī)則
格式:
main:main.o add.o max.o
gcc -o main.o add.o max.o
編譯main.o add.o max.o
這三個(gè)文件時(shí),gcc前面必須要輸入tab鍵(縮進(jìn))。
第三步:寫可執(zhí)行文件main的main.o、add.o、max.o文件的依賴文件和依賴文件的編譯規(guī)則
格式:
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
max.o:max.c
gcc -c max.c
以上步三步總結(jié)起來就是all去指定最終生成的可執(zhí)行程序?yàn)閙ain程序,然后我們的程序就會(huì)去找main程序和它的依賴文件main.o、add.o、max.o,然后通過編譯規(guī)則gcc -o main.o add.o max.o
生成可執(zhí)行程序main。如果沒有找到main程序的依賴文件main.o、add.o、max.o,接著就會(huì)分別去找main.o、add.o、max.o的依賴文件main.c、add.c、max.c,找到之后通過編譯規(guī)則gcc -c main.c
、gcc -c add.c
、gcc -c max.c
將main.c、add.c、max.c文件分別轉(zhuǎn)換成main.o、add.o、max.o文件,然后通過編譯規(guī)則gcc -o main.o add.o max.o
生成可執(zhí)行程序main。
第四步:清理工程,把整個(gè)過程中不是自己寫的代碼,也就是中間生成的一些文件刪掉。
格式:
clean:
rm -rf *.o main
具體如下圖所示:
保存退出之后就可以使用make指令編譯代碼。
makefile文件中還可以寫入安裝指令install
,但是安裝指令需要在管理員模式下用make指令來實(shí)現(xiàn)。
(2)make指令編譯代碼并在編譯完成后執(zhí)行程序main
在make指令執(zhí)行完之后可以通過make clean
執(zhí)行對(duì)應(yīng)的規(guī)則,去刪除.o文件和main程序:
①此時(shí)再去執(zhí)行兩次make指令:
出現(xiàn)這樣的結(jié)果是因?yàn)槲覀儾]有修改代碼,所以不需要去編譯,整個(gè)代碼是最新的。
②如果修改add.c中的代碼,在代碼中加一個(gè)空格(在分號(hào)前面加一個(gè)空格)并保存,并沒有改變代碼的邏輯:
此時(shí),通過make指令編譯代碼:
可以發(fā)現(xiàn)將add.c重新編譯了,然后進(jìn)行重新連接生成最終的main程序。
通過路徑運(yùn)行可執(zhí)行文件:
在生成可執(zhí)行程序后才能進(jìn)行調(diào)試程序,調(diào)試程序主要是解決邏輯上的錯(cuò)誤和軟件上的權(quán)限。也就是編譯成功才能進(jìn)行調(diào)試,如果編譯不成功就是存在語法問題。編譯成功后運(yùn)行的結(jié)果和我們期望的結(jié)果不一樣的時(shí)候進(jìn)行調(diào)試程序。
調(diào)試的對(duì)象:運(yùn)行著的程序(進(jìn)程)。不是調(diào)試main.c也不是調(diào)試main,而是調(diào)試正在運(yùn)行著的main。
跟蹤程序:gdb是跟蹤程序的一個(gè)工具,只能跟蹤含有調(diào)試信息的程序,也就是說只能跟蹤debug版本不能跟蹤release版本
1.Debug 版本和 Release 版本
(1)Debug 版本
Debug 版本為可調(diào)式版本,生成的可執(zhí)行文件中包含調(diào)試需要的信息。我們作為開發(fā)人員,最常用的就是debug版本的可執(zhí)行文件。
(2)Release 版本
Release 版本為發(fā)行版本,是提供給用戶使用的版本。用gcc默認(rèn)生成的就是Release版本,不包含調(diào)試信息。
首先將源代碼編譯、鏈接生成Debug版本的可執(zhí)行文件,然后通過‘gdb Debug版本的可執(zhí)行文件名’進(jìn)入調(diào)試模式。
(3)Release 版本中生成調(diào)試信息
因?yàn)檎{(diào)試信息是在編譯過程時(shí)加入到中間文件(.o)中的,所以必須在編譯時(shí)控制其生成包含調(diào)試信息的中間文件。
生成調(diào)試調(diào)試信息:gcc -c main.c -g
:
可以看出在沒有生成調(diào)試信息是可執(zhí)行程序main的大小為16816,生成調(diào)試信息之后main的大小為19944,說明此時(shí)為調(diào)試版本。
生成包含調(diào)試信息的中間文件 :gcc -o hello hello.o
或者 gcc -o hello hello.c -g
(4)把調(diào)試版本容納到makefile文件中
第8行gcc -o main main.o add.o max.o
是一個(gè)鏈接過程,并不是編譯過程,而調(diào)試信息是在編譯過程生成的,所以gcc -o main main.o add.o max.o
后面不能用寫$(GDB)
。
此時(shí),用make指令進(jìn)行編譯就是調(diào)試版本:
如果下次想用Release 版本,那就把makefile文件中的GDB=-g
改為GDB=
,這時(shí)就從調(diào)試版本轉(zhuǎn)換到了Release 版本。
因篇幅問題不能全部顯示,請(qǐng)點(diǎn)此查看更多更全內(nèi)容
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)