Presentation is loading. Please wait.

Presentation is loading. Please wait.

Makefile & Cmake OSLab 蔡冠宏.

Similar presentations


Presentation on theme: "Makefile & Cmake OSLab 蔡冠宏."— Presentation transcript:

1 Makefile & Cmake OSLab 蔡冠宏

2 Outline Introduction to compilation flow Makefile Cmake

3 Introduction to compilation flow
C code 編譯器 組譯碼(*.s) 組譯器(as) 目的碼 目的碼(*.o) 連結器(ld) 可執行程式

4 GCC常用編譯選項 選項 說明 -c 將原始檔案編譯成目的碼(*.o) -S 將原始檔案編譯成組譯碼(*.s) -E
只將原始檔做pre-processor處理(*.i) -o file 指定輸出檔的檔名 -W 指定需要顯示的警告資訊,-Wall表示顯示所有警告資訊

5 Makefile 透過你所設定的條件幫你編譯好 方便專案管理 會透過檔案比對,依照相依性來編譯,不會全都編浪費時間
可以同時編譯函式庫或是檔案

6 Make常用參數選項 選項 含義 -f filename 指定make需要用那個makefile檔案 -C dirname
指定make在開始執行後的工作目錄為dirname -k 執行指令出錯時,放棄當前目標,繼續維護其他目標 -n 只印出將會進行的工作,而不會真的去執行 -s 執行但不顯示指令 -r 忽略內部規則 -p 顯示Makefile中所有的變數和內部規則

7 make指令格式 make [option] [target] Option指的是設定的參數,target指的是要產生出來的目標。
Example: make -n all clean make install make -f makefile2 install

8 撰寫makefile檔案 makefile是由一堆「目標(target)」和其「相依性檔案(dependency)」還有「法則(rule)」所組成的。 法則在寫的時候前面不可以使用空格,只能使用Tab鍵。 同一法則要換行的話需要使用‘\’字元,加入註解用'#'為開頭字元。

9 makefile的格式 [target]: [dependency] [dependency] [TAB][rule] [TAB][rule] [target]: [dependency] [TAB][rule]

10 常用的target慣例 all:表示編譯所有的內容,是make執行時預設的目標。 clean:表示清除目標
distclean:表示清除所有內容 install:表示進行安裝的內容

11 Example all: myapp myapp: main.o a.o b.o [tab]gcc main.o a.o b.o -o myapp main.o: main.c a.h [tab]gcc -c main.c a.o: a.c a.h [tab]gcc -c a.c b.o: b.c b.h [tab]gcc -c b.c

12 多重target all: myapp myapp: main.o a.o b.o [tab]gcc main.o a.o b.o -o myapp main.o: main.c a.h [tab]gcc -c main.c a.o: a.c a.h [tab]gcc -c a.c b.o: b.c b.h [tab]gcc -c b.c #install 安裝套件 install: myapp [tab]cp myapp /usr/local/myapp/ #clean 刪除產生出來的目的檔 clean: [tab]rm -f *.o

13 make的巨集(macro) CC = gcc 指定 $(CC) 叫用 CFLAGS = -ansi -Wall -g 指定 $(CFLAGS) 叫用 SRC = a.c b.c OBJ = $(SRC:.c=.o)

14 特別的內部巨集 $? 代表需要重建的相依性項目 $@ 目前的目標項目名稱 $< 代表第一個相依性項目
$* 代表第一個相依性項目,不過不含副檔名

15 Example #compiler CC = gcc #cflags CFLAGS = -Wall -ansi -g #object OBJS = main.o a.o b.o #install path INSTALL_PATH = /usr/local/myapp/ all: myapp myapp: $(OBJS) [tab]$(CC) $(OBJS) -o main.o: main.c a.h [tab]$(CC) $(CFLAGS) -c -o $< a.o: a.c a.h [tab]$(CC) $(CFLAGS) -c -o $< b.o: b.c b.h [tab]$(CC) $(CFLAGS) -c -o $< #install 安裝套件 install: myapp [tab]cp myapp $(INSTALL_PATH) #clean 刪除產生出來的目的檔 clean: [tab]rm -f *.o

16 萬用字元的語法 #compiler CC = gcc #cflags CFLAGS = -Wall #object OBJS = main.o a.o b.o #include path INCLUDE_PATH = include all: myapp myapp: $(OBJS) [tab]$(CC) $(OBJS) -o %.o: %.c [tab]$(CC) -I$(INCLUDE_PATH) $(CFLAGS) -c -o $<

17 Cmake 跨平台的自動化建構系統。 利用組態檔(CmakeLists.txt)產生標準的建構檔。 cmake CmakeList.txt
Native Build System CmakeList.txt Ntive Build Tools Executables Libraries

18 Source/Binary Tree Source tree Binary tree/Build tree Cmake輸入檔 原始程式碼
平台相依的建構輸出 Makefile, GNUmakefile, .dsp, .xcodebuild 執行檔、函式庫 *.exe, *.so, *.dll, *.lib

19 Hello Cmake Example Hello src Include demo.c hello.c CMakeLists.txt
hello.h

20 CMakeLists.txt In hello CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
#project name PROJECT(HELLO) #source code subdirectories SUBDIRS(src) #Location of library include files INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

21 CMakeLists.txt In src directory
INCLUDE_DIRECTORYS(${HELLO_SOURCE_DIR}/include ${HELLO_SOURCE_DIR}/src) ADD_EXECUTABLE(hello demo.c hello.c)

22 Build Project Step1:Create a directory to build
Ex:mkdir hello_build Step2:Enter this directory and type: cmake ../hello Step3:Now…the configuration is generated,type make to make Makefile make The output binary is in src directory

23 Question What’s the format of writing Makefile?
What do $?,$<, $* mean in Makefile? How to use CMakeLists.txt in cmake? What’s the feature about cmake?

24 Homework Use linked list data structure and required API to implement stack operation. The function’s definition and declration must be separated form src and include directory. Write Makefile and CMakeLists.txt to compile them respectively. Write your thoughts about make and cmake.


Download ppt "Makefile & Cmake OSLab 蔡冠宏."

Similar presentations


Ads by Google