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)鏈接庫和動(dòng)態(tài)鏈接庫(共享庫)
如果動(dòng)態(tài)庫和靜態(tài)庫同時(shí)存在的場(chǎng)合下,(同名庫)優(yōu)先選擇動(dòng)態(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谨设、生成動(dòng)態(tài)鏈接庫
gcc -fpic -shared -o libmySort.so mySort.o
gcc -o main main.o -L./ -lmySort
說明:
1熟掂、-fpic:生成位置無關(guān)的代碼
2、-shared :指令生成動(dòng)態(tài)庫
3扎拣、lmySort:加載動(dòng)態(tài)庫libmySort.so
注意:
此時(shí)執(zhí)行./main 失效赴肚,原因無法查找鏈接的動(dòng)態(tài)庫素跺,默認(rèn)的執(zhí)行路徑為/lib。
解決方式1:
將libmySort.so移動(dòng)到/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
對(duì)應(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
自動(dòng)變量
^ 代表所有的依賴
$< 代表依賴項(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)
//注意變量的小括號(hào) $()
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
//測(cè)試
make
make rebuild
make clean