# unix overview ###### tags: `UNIX` ## make、makefile 指令的編譯: ```makefile= #一般而言可以使用以下寫法 g++ a.c b.c -o test #建議改成以下 g++ -c a.c g++ -c b.c g++ a.o b.o -o test #以後如果改新東西只會重新complie那隻程式,不會全部complie ``` 因此要使用方案而最簡單的方式使用makefile : - 怕使用的編譯器不同,導致後面complie的symbol不同 - 後面要重新編譯,就不用打指令complie,直接make就好 - 只會編譯改過的檔案,比較快速 ### makefile之語法 : ```makefile= #General format rulename: dependencies(or prequisites) #rulename - 要建立的目標黨 後面加上要依賴的黨名or其他所生出來的規則 #ex test: test1.c test2.c gcc -c test1.c gcc -c test2.c gcc -o test test1.o test2.o #此寫法不優 #若只改一份檔案結果test1.c及test2.c都需要重新編譯 clean: rm -f *.o ``` 為了大家都用同一個編譯器,以及可只編譯改過的檔案,有以下變數可使用 ```makefile= CC = gcc CXX = g++ #設定變數 -變數名稱可以任意取名 CFLAGS = -g -Wall LDFALGS = all: hello hello: s1.c s2.c s3.c hello.c gcc $(CFLAGS) -c s1.c #要取出變數內容就使用$(variable) gcc $(CFLAGS) -c s2.c gcc $(CFLAGS) -c s3.c gcc $(CFLAGS) -c hello.c gcc -o $@ s1.o s2.o s3.o hello.o $(LDFLAGS) ``` #### Automatic Variables - ```$@``` : 目標檔案 (現在運行的規則名稱) - ```$<``` : 取出第一項需求 - ```$?``` : 取出比現在target還要新的需求 - ```$^``` : 全部的依賴黨,重複的部分會移除 - ```$+``` : 像是$^,但重複的不會被移除 ```makefile= #因此可以將上方範例改寫成此 CC = gcc CFLAGS = -g -Wall #.c.o是makefile內建規則,可以跟makefile説把.c轉換成.o黨可以利用此規則(為舊的寫法) .c.o: $(CC) -c $< $(CFLAGS) #現在常見寫法為 '%'是萬用字元,可以代表所有的filename %.o: %.c $(CC) -c -o $@ $< test: test1.o test2.o $(CC) -o test $^ ``` #### 特殊字元 - ```@```: 不會顯示執行的命令 - ```%``` : 萬用字元可以代表所有可能的string - ```-``` : 就算出錯還是會持續執行 - ```.PHONY``` :makefile不會檢查檔案中有沒有此檔 ## debugger 可以一行一行去debug,在makefile中需要放入-g的flag 之後要denugger就使用gdb指令去debug 後面debug完後使用strip可以移除執行不需要的檔案 ## reference: 高等UNIX上課PPT [c++ static & extern](https://medium.com/@alan81920/c-c-%E4%B8%AD%E7%9A%84-static-extern-%E7%9A%84%E8%AE%8A%E6%95%B8-9b42d000688f) [makefile語法介紹](https://hackmd.io/@sysprog/SySTMXPvl) [資訊人筆記](https://www.kshuang.xyz/doku.php/course:nctu-%E9%AB%98%E7%AD%89unix%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88:chapter7)