如何給自己網(wǎng)站做反鏈seo的中文意思是什么
目錄
導(dǎo)讀
1. make/Makefile
1.1?引入
1.2 概念
1.3 語(yǔ)法規(guī)則
1.4?示例
2.?Linux調(diào)試器-gdb
2.1 引入
2.2 概念
2.3 使用
導(dǎo)讀
我們?cè)谏洗沃v了Linux編輯器gcc\g++的使用,今天我們就來進(jìn)一步的學(xué)習(xí)如何調(diào)試,以及makefile這個(gè)強(qiáng)大的工具。
1. make/Makefile
1.1?引入
會(huì)不會(huì)寫makefile,從一個(gè)側(cè)面說明了一個(gè)人是否具備完成大型工程的能力。
一個(gè)工程中的源文件不計(jì)數(shù),其按類型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的 規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜 的功能操作
1.2 概念
在Linux中,make
是一個(gè)常用的構(gòu)建工具,用于自動(dòng)化構(gòu)建和管理程序的編譯過程。
make
工具通過讀取一個(gè)叫做Makefile
的文件來執(zhí)行編譯和鏈接等操作。
Makefile
中包含了一系列的規(guī)則和指令,用于描述如何將源代碼轉(zhuǎn)換為可執(zhí)行程序。
- makefile帶來的好處就是——“自動(dòng)化編譯”,一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開發(fā)的效率。
- make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個(gè)命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?#xff0c;makefile都成為了一 種在工程方面的編譯方法。
- make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動(dòng)化構(gòu)建。
1.3 語(yǔ)法規(guī)則
Makefile語(yǔ)法規(guī)則包括目標(biāo)、依賴關(guān)系和命令。
1. 目標(biāo)(Target):指定要構(gòu)建的文件或操作的名稱。目標(biāo)是make
工具的主要執(zhí)行對(duì)象。
target: dependenciescommand
2. 依賴(Dependencies):規(guī)定目標(biāo)所依賴的文件或操作。依賴關(guān)系用于確定何時(shí)需要重新構(gòu)建目標(biāo)??梢杂卸鄠€(gè)依賴項(xiàng),用空格分隔。
target: dependency1 dependency2command
3. 命令(Commands):描述了如何生成目標(biāo)的命令。命令必須以制表符開始,并且在同一行上??梢杂卸鄠€(gè)命令,每個(gè)命令占一行。
target: dependenciescommand1command2
4.??變量(Variables):可以在Makefile
中定義變量,用于存儲(chǔ)常用的參數(shù)和選項(xiàng)。變量可以通過$(variable_name)
來引用。
variable_name = value
?5. 注釋(Comments):使用#
符號(hào)來添加注釋。注釋可以出現(xiàn)在任意位置,并且會(huì)被忽略。
# This is a comment
6. 偽目標(biāo)(Phony Targets):有些目標(biāo)不是實(shí)際的文件,而是用于執(zhí)行特定操作的偽目標(biāo)??梢允褂?code>.PHONY聲明偽目標(biāo)。
.PHONY: target
7.?默認(rèn)目標(biāo)(Default Target):Makefile
可以指定一個(gè)默認(rèn)的目標(biāo),當(dāng)沒有明確指定目標(biāo)時(shí),會(huì)執(zhí)行默認(rèn)目標(biāo)。使用.DEFAULT_GOAL
指定默認(rèn)目標(biāo)。
.DEFAULT_GOAL := target
1.4?示例
編寫一個(gè)簡(jiǎn)單程序:
[zhy@centos7 ~]$ vim test.c
[zhy@centos7 ~]$ cat test.c
#include <stdio.h>int main()
{printf("hello world\n");return 0;
}
編寫makefile文件:
其中 test?是的目標(biāo)文件,也是我們的最終生成的可執(zhí)行文件。
依賴文件就是 test.c源文件,然后使用我們的gcc命令,重建目標(biāo)文件。
[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
test: test.cgcc -o test test.c
執(zhí)行make命令:
執(zhí)行make命令后,makefile文件里的 gcc -o test test.c 命令被執(zhí)行,生成一個(gè)test可執(zhí)行文件。
[zhy@centos7 ~]$ ls
111 a.out install.sh makefile test.c
[zhy@centos7 ~]$ make
gcc -o test test.c
[zhy@centos7 ~]$ ls
111 a.out install.sh makefile test test.c
[zhy@centos7 ~]$ ./test
hello world
繼續(xù)編輯makefile文件:
clean
是一個(gè)偽目標(biāo),用于清理生成的目標(biāo)文件和可執(zhí)行文件。它的命令是刪除test文件。- 使用
.PHONY
聲明了clean
是一個(gè)偽目標(biāo),防止與同名文件沖突。
[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
test: test.cgcc -o test test.c# 定義偽目標(biāo)和命令
clean:rm -f test.PHONY: clean
?
再次執(zhí)行make命令:
?要清理生成的文件,可以執(zhí)行make clean
命令。
[zhy@centos7 ~]$ ls
111 a.out install.sh makefile test test.c
[zhy@centos7 ~]$ make clean
rm -f test
[zhy@centos7 ~]$ ls
111 a.out install.sh makefile test.c
定義變量:
使用CC定義了編譯器和編譯選項(xiàng)的變量。
[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
# 定義變量
CC = gcc
CFLAGS = -Wall -gtest: test.c$(CC) -o test test.c# 定義偽目標(biāo)和命令
clean:rm -f test.PHONY: clean
2.?Linux調(diào)試器-gdb
2.1 引入
我們?cè)趯懢帉慍語(yǔ)言代碼時(shí)難免會(huì)遇到一些解決不了的bug,這時(shí)我們會(huì)選擇去進(jìn)行調(diào)試,看看到底是哪一部分出現(xiàn)了錯(cuò)誤,從而進(jìn)一步的解決問題。
相對(duì)的,我們?cè)贚inux中編寫程序時(shí)也可以進(jìn)行調(diào)試。
2.2 概念
GDB是一種強(qiáng)大的命令行調(diào)試器,可用于調(diào)試C、C++和其他編程語(yǔ)言的程序。
DB具有許多功能,包括設(shè)置斷點(diǎn)、單步執(zhí)行、查看變量值、查看內(nèi)存內(nèi)容、追蹤函數(shù)調(diào)用等。它還支持多線程和多進(jìn)程調(diào)試,可以與各種編譯器和調(diào)試器一起使用。
程序的發(fā)布方式有兩種,debug模式和release模式
Linux gcc/g++出來的二進(jìn)制程序,默認(rèn)是release模式
要使用gdb調(diào)試,必須在源代碼生成二進(jìn)制程序的時(shí)候, 加上 -g 選項(xiàng)
2.3 使用
基本命令:
list/l 行號(hào):顯示binFile源代碼,接著上次的位置往下列,每次列10行。
list/l 函數(shù)名:列出某個(gè)函數(shù)的源代碼。
continue(或c):從當(dāng)前位置開始連續(xù)而非單步執(zhí)行程序。
run(或r):從開始連續(xù)而非單步執(zhí)行程序。
n 或 next:單條執(zhí)行。
s或step:進(jìn)入函數(shù)調(diào)用。
break(b)?行號(hào):在某一行設(shè)置斷點(diǎn)。
break?函數(shù)名:在某個(gè)函數(shù)開頭設(shè)置斷點(diǎn)。
info break :查看斷點(diǎn)信息。
finish:執(zhí)行到當(dāng)前函數(shù)返回,然后挺下來等待命令。
print(p):打印表達(dá)式的值,通過表達(dá)式可以修改變量的值或者調(diào)用函數(shù)。
p 變量:打印變量值。
set?var:修改變量的值。
delete?breakpoints:刪除所有斷點(diǎn)。
delete?breakpoints?n:刪除序號(hào)為n的斷點(diǎn)。
disable?breakpoints:禁用斷點(diǎn)。
enable?breakpoints:啟用斷點(diǎn)。
info(或i)?breakpoints:參看當(dāng)前設(shè)置了哪些斷點(diǎn)。
display?變量名:跟蹤查看一個(gè)變量,每次停下來都顯示它的值。
undisplay:取消對(duì)先前設(shè)置的那些變量的跟蹤。
until X行號(hào):跳至X行。
breaktrace(或bt):查看各級(jí)函數(shù)調(diào)用及參數(shù)。
info(i)?locals:查看當(dāng)前棧幀局部變量的值。
quit:退出gdb。
示例:
編寫一段代碼:
[zhy@centos7 ~]$ vim project.c
[zhy@centos7 ~]$ cat project.c
#include <stdio.h>int main() {int num1 = 5;int num2 = 0;int result;result = num1 / num2;printf("The result is: %d\n", result);return 0;
}
將程序編譯為可調(diào)試的可執(zhí)行文件:
gcc -g project.c -o project
啟動(dòng)gdb調(diào)試器:
這將啟動(dòng)gdb,并顯示(gdb)提示符。
gdb project
顯示源代碼:
list
設(shè)置斷點(diǎn):
這將在main
函數(shù)的開頭設(shè)置一個(gè)斷點(diǎn)。
break main
?
?運(yùn)行程序:
程序?qū)㈤_始執(zhí)行,并在達(dá)到斷點(diǎn)處停止。
run
?
?單步執(zhí)行:
這將單步執(zhí)行程序,進(jìn)入main
函數(shù)。
step
?
?檢查變量的值:
print num1
?
?繼續(xù)執(zhí)行程序:
continue
?
檢查錯(cuò)誤:
continue命令之后會(huì)繼續(xù)執(zhí)行,程序會(huì)在除以0的地方崩潰。在運(yùn)行到該語(yǔ)句時(shí),gdb會(huì)停止并顯示相關(guān)信息。