Makefile筆記
Makefile筆記
這是會是一個持續更新的筆記···
1. 特殊變數$@、$^、$<
$@代表所有的目標檔案,$^表示所有的依賴檔案,$<表示第一個依賴檔案。
在makefile中使用echo命令輸出“$@”時,應使用:\$$@。
e.g:Makefile
all:
@echo \$$@ = $@
執行make以後輸出:
$@ = all
把上面的特殊變數都放在Makefile中看看,
e.g:Makefile:
all:hello world
@echo \$$@ = $@
@echo $$^ = $^
@echo $$\< = $<
hello:
world:
執行make以後輸入如下:
$@ = all
$^ = hello world
$< = hello
其中,@echo $$\< = $< 這條語句可以換成 @echo “$$< = $<” ,其實就是為echo後面的語句加了
雙引號,然後去掉了$符號後面的反斜槓”\“。
2. 和標頭檔案相關的依賴關係的生成
為了讓Makefile支援在修改每個c檔案所包含的標頭檔案之後,會重新編譯生成目標檔案。我們的依賴
關係一般寫成這樣(假如存在main.c,其包含了main.h):
main.o:main.c main.h
這樣寫的應該就不是一個好的程式設計師,因為好程式設計師都很懶。其實應該讓Makefile自動為我們建立
依賴檔案。
先來說一下-MM和-M,這兩個是gcc的選項。假設我當前目錄下有兩個檔案:main.c main.h:
tomato@ubuntu:~/shdir$ ls
main.c main.h
tomato@ubuntu:~/shdir$ cat main.c
#include <stdio.h>
#include "main.h"
int main(void)
{
return 0;
}
tomato@ubuntu:~/shdir$
先使用-MM這個引數,看看會有什麼情況發生:
tomato@ubuntu:~/shdir$ gcc -MM main.c
main.o: main.c main.h
tomato@ubuntu:~/shdir$
很眼熟吧,這樣的依賴關係一目瞭然。
接著使用-M引數:
tomato@ubuntu:~/shdir$ gcc -M main.c
main.o: main.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/x86_64-linux-gnu/bits/predefs.h \
/usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h main.h
tomato@ubuntu:~/shdir$
列出了一堆的系統標頭檔案,最後還有我們自己新增的main.h。系統檔案一般我們
都不會去修改,所以我們只需要使用-MM這個引數就好了~修改以後的Makeffile如下:
.PHONY: clean
SRCS:=$(wildcard *.c)
OBJS:=$(SRCS:.c=.o)
DEPS:=$(SRCS:.c=.dep)
all:main
-include $(DEPS)
main:$(OBJS)
gcc -o main $(OBJS)
%.o:%.c
gcc -c $< -o $@
%.dep:%.c
@set -e;\
gcc -E -MM $^ > $@
clean:
rm *.o *.dep
現在,當你修改了標頭檔案,重新執行make的時候,main檔案會被重新構建~
============================== Sun Apr 13 15:59:51 CST 2014
相關文章
- makefile筆記(2)筆記
- Makefile學習筆記筆記
- Makefile 讀書筆記筆記
- 嵌入式之Makefile學習筆記筆記
- MakeFile 學習筆記一 核心內容筆記
- Android Mk Application Mk make makefile筆記AndroidAPP筆記
- Linux下的makefile編寫 ——陳皓《跟我一起寫Makefile》學習筆記(二)Linux筆記
- Linux學習筆記——例說makefile 多個檔案Linux筆記
- Linux學習筆記——例說makefile 單個C檔案Linux筆記
- Linux學習筆記——例說makefile 增加系統共享庫Linux筆記
- Linux學習筆記——例說makefile 標頭檔案查詢路徑Linux筆記
- Makefile
- 【Makefile】5-Makefile變數的基礎變數
- makefile 詳解
- makefile快速入門
- makefile之overrideIDE
- makefile 簡明教程
- Makefile學習(一)
- 使用makefile編譯編譯
- Makefile使用教程1
- makefile檔案案例
- Linux驅動開發筆記(三):基於ubuntu的驅動、makefile編寫以及編譯載入流程Linux筆記Ubuntu編譯
- Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯Linux筆記原始碼編譯
- Makefile學習之路(2) — Makefile的變數和萬用字元變數字元
- CMakeFile.txt透過sysroot方式後生成makefile報錯
- 印象筆記 --- 方法分享筆記筆記
- 初識makefile結構
- udp測試程式 + makefileUDP
- Makefile例項學習
- makefile =和:=的區別
- cmake Makefile面試問題面試
- Makefile之大型工程專案子目錄Makefile的一種通用寫法
- makefile 條件判斷用法和 自定函式用法簡單記錄函式
- 筆記筆記
- CUUG筆記 ORACLE索引學習筆記筆記Oracle索引
- 主動筆記與被動筆記筆記
- Makefile好助手:pkgconfigGC
- C編譯: makefile基礎編譯