GCC編譯
多文件編譯
1、將所有的.c文件生成.o文件

2、生成可執(zhí)行文件

gcc執(zhí)行過程
1、gcc -c main.c -o main.o -I ../header
-c:指定生成.o文件
-o:指定生成文件的名字
-I:指定包含頭文件的路徑
2、gcc -o main main.o add.o
將main.o和add.o生成目標(biāo)文件(可執(zhí)行文件)main
3、執(zhí)行文件
./main
第三方庫
靜態(tài)鏈接庫和動態(tài)鏈接庫(共享庫)
如果動態(tài)庫和靜態(tài)庫同時(shí)存在的場合下,(同名庫)優(yōu)先選擇動態(tài)庫。
1、生成靜態(tài)鏈接庫
gcc -o mySort.o -c mySort.c -I ../header/
ar -rv -o libmySort.a mySort.o
gcc -o main.o -c main.c -I ../header/
gcc -o main main.o -L./ -lmySort
./main
說明:
1、生成靜態(tài)庫的指令 ar -rv
2、指定靜態(tài)庫 libmySort.a ,其中l(wèi)ib和.a不可以改變
3、-L:搜索第三方庫的路徑
4、-lmySort:加載靜態(tài)庫libmySort.a
2、生成動態(tài)鏈接庫
gcc -fpic -shared -o libmySort.so mySort.o
gcc -o main main.o -L./ -lmySort
說明:
1、-fpic:生成位置無關(guān)的代碼
2、-shared :指令生成動態(tài)庫
3、lmySort:加載動態(tài)庫libmySort.so
注意:
此時(shí)執(zhí)行./main 失效,原因無法查找鏈接的動態(tài)庫,默認(rèn)的執(zhí)行路徑為/lib。
解決方式1:
將libmySort.so移動到/lib下
解決方式2:
vi ~/.bashrc 修改設(shè)置環(huán)境變量
xport LD_LIBRARY_PATH=/home/neusoft/桌面/demo01/source/lib(指定的.so文件的路徑,比如我的是存放在了/home/neusoft/桌面/demo01/source/lib路徑下)
gdb調(diào)試
gdb調(diào)試邏輯的錯(cuò)誤。
調(diào)試步驟:
-g
gdb 可執(zhí)行程序名字
list查看文件內(nèi)容及函數(shù)
設(shè)置斷點(diǎn) b 行數(shù)
執(zhí)行 r
單步執(zhí)行 n
進(jìn)入函數(shù)內(nèi)部 s
查看變量的值 p
退出調(diào)試 quit
執(zhí)行下一個(gè)斷點(diǎn) c
info b查看斷點(diǎn)信息
disable b 1 使斷點(diǎn)1失效
bt 顯示堆棧
makefile
1、touch makefile/Makefile
2、編輯
1個(gè)規(guī)則
gcc -o main main.c
目標(biāo):依賴項(xiàng)
(tab制表符) 命令
3、make執(zhí)行
4、執(zhí)行./main
版本2:
gcc -o main.o -c ./source/main.c -I ./header
gcc -o mySort.o -c ./func/mySort.c -I ./header
gcc -o main main.o mySort.o
對應(yīng)Makefile文件的內(nèi)容
main:main.o mySort.o
gcc -o main main.o mySort.o
mySort.o:./func/mySort.c
gcc -o mySort.o -c ./func/mySort.c -I ./header
main.o:./source/main.c
gcc -o main.o -c ./source/main.c -I ./header
版本3:
自定義變量
2個(gè)函數(shù)
src = $(wildcard ./source/.c,./func/.c)
wildcard是一個(gè)函數(shù),參數(shù)是./*.c 返回值賦值給obj
功能:查找當(dāng)前路徑下的所有的.c文件
patsubst
obj = (src))
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o main $(obj)
mySort.o:./source/mySort.c
gcc -o mySort.o -c ./source/mySort.c -I ./header -w
main.o:./source/main.c
gcc -o main.o -c ./source/main.c -I ./header -w
clean:
-rm -rf $(obj) //清除編譯過程中出現(xiàn)的*.o
自動變量
^ 代表所有的依賴
$< 代表依賴項(xiàng)中的第一個(gè)
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
mySort.o:./source/mySort.c
gcc -o mySort.o -c $< -I ./header -w
main.o:./source/main.c
gcc -o main.o -c $^ -I ./header -w
clean:
-rm -rf $(obj)
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
%.o:./source/%.c
gcc -o $@ -c $< -I ./header -w
clean:
-rm -rf $(obj)
//注意變量的小括號 $()
src=$(wildcard *.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
%.o:%.c
gcc -o $@ -c $<
clean:
rm main *.o
rebuild:clean main
//測試
make
make rebuild
make clean