主要是因為[Day 12]中我們有使用到WSL
+ VSCode
做基本的編譯,裡面涉及一些WSL還有VSCode的操作技巧,其實內容加起來蠻複雜的,然後有收到有人來信說透過vscode打開wsl會有安裝改檔權限相關的問題,所以今天才特別設定一個篇章說明
PS: 下面會有點複雜繁瑣,如果你比較喜歡簡單一點可以直接掉到後面的表格去看 XD
標準變數 CC/ CPPFLAGS / CFLAGS / CXXFLAGS / LDFLAGS / LDLIBS
CC = cc
(通常 cc
會是系統上 gcc 的符號連結,也可以設定成clang
)自動變數 $@、$<、$^、$?、$+、$*、$$
→ 偏向 目標感知
特殊目標 → 特殊行為的導向
運算子與語法符號 (可以直接看後面表格整理)
常用函數 → make
語法中的function
都偏向 GNU MAKE
的內建文字處理函數
(可以直接看後面表格整理)
root
打開,這樣一來就可以預設root
開起來執行 wsl -l -v # 找出你的環境名稱
下下面的指令可以把預設開起來的使用者改成 root 的權限,root的權限預設可以直接修改檔案
wsl -d Ubuntu-22.04(這是你上面得到的環境名稱) -u root
如果你想要永久修改的話
ubuntu2204 config --default-user root
wsl.exe -d Ubuntu-22.04 -u root
wsl.conf
(推薦做法)打開powershell 打 wsl
進入wsl terminal
sudo nano /etc/wsl.conf
你會看到下面的介面
介面中加上這一行,ctrl + X
存檔
[user]
default=root
上面的方法完成設定這樣你的vscode wsl 打開就會是預設的root使用者了
https://www.gnu.org/s/make/manual/html_node/Automatic-Variables.html
https://earthly.dev/blog/makefile-variables/
https://www.gnu.org/software/make/manual/make.html
變數名 | 用途 | 範例 |
---|---|---|
CPPFLAGS |
前處理器選項(Preprocessor flags) | -Iinclude -DDEBUG |
CFLAGS |
C 語言編譯選項 | -Wall -O2 -g |
CXXFLAGS |
C++ 編譯選項 | -std=c++17 -fno-exceptions |
FFLAGS |
Fortran 編譯選項 | -O3 -fcheck=all |
LDFLAGS |
連結器選項 | -Llib -Wl,-rpath,./lib |
LDLIBS |
連結所需函式庫 | -lm -lpthread |
符號 | 意義 | 範例 |
---|---|---|
$@ |
目前規則的目標(target) | main.o |
$< |
第一個相依檔(first prerequisite) | main.c |
$^ |
所有相依檔(去重複) | main.c calc.c |
$+ |
所有相依檔(保留重複與順序) | main.c main.c |
$? |
所有比目標新的相依檔 | calc.c |
$* |
不含副檔名的檔名(stem) | main |
$$ |
輸出 $ 本身 |
echo $$PATH |
符號 | 功能 |
---|---|
.PHONY |
標記假目標,避免與檔案同名衝突 |
.SUFFIXES |
定義隱含規則處理的副檔名 |
.DEFAULT |
沒有符合規則時執行 |
.PRECIOUS |
避免中斷時刪掉產物 |
.DELETE_ON_ERROR |
規則失敗時刪掉不完整的檔案 |
.ONESHELL |
同一規則的多行命令在同一個 shell 中執行 |
符號 | 功能 | 範例 |
---|---|---|
: |
一般相依,左邊目標依賴右邊檔案 | main.o: main.c |
**` | `** | order-only 相依:必須存在,但時間戳不觸發重建 |
% |
pattern rule 萬用字元 | %.o: %.c |
@ |
隱藏命令本身的輸出 | @echo "build..." |
- |
忽略錯誤繼續執行 | -rm -f *.o |
?= |
僅在未被設定時才賦值(預設值) | CC ?= gcc |
+= |
在原有值後累加內容 | CFLAGS += -Wall |
函數 | 功能 | 範例 |
---|---|---|
$(wildcard *.c) |
展開符合條件的檔案 | main.c utils.c |
$(patsubst %.c,%.o,$(SRCS)) |
替換副檔名 | .c → .o |
$(dir $@) |
取路徑 | src/main.o → src/ |
$(notdir $@) |
取檔名 | src/main.o → main.o |
$(basename $@) |
去副檔名 | main.c → main |
$(addprefix obj/,$(SRCS)) |
加前綴 | obj/main.c |
$(addsuffix .o,$(FILES)) |
加後綴 | main.o util.o |