---
# System prepended metadata

title: unix overview
tags: [UNIX]

---

# 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)

