# Makefile

​​

![makefile flowchart](https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FWlyiHvHULIkZB6YbCk3X%2Fimage.png?alt=media\&token=4130d9d2-c919-4e46-867c-98e9432cc1c1)

### ตัวอย่างไฟล์ Makefile อย่างง่ายแบบที่ 1

![](https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FzHZRbxWmgUE0uYpomf8N%2Fimage.png?alt=media\&token=d66aad3b-6e58-4b4d-860c-79010f1e91a6)

<pre class="language-c"><code class="lang-c">all: hello

<strong>hello:	main.o factorial.o hello.o
</strong>	g++ main.o factorial.o hello.o -o hello
main.o:	main.cpp
	g++ -c main.cpp
factorial.o:	factorial.cpp
	g++ -c factorial.cpp
hello.o:	hello.cpp
	g++ -c hello.cpp
clean:
	rm -rf *o hello
</code></pre>

### ตัวอย่างไฟล์ Makefile อย่างง่ายแบบที่ 2

ใช้ macro เพื่อสร้างตัวแปร CC และ CFLAGS

```c
# the compiler to use
CC=g++
# options passed to the compiler
CFLAGS=-c -Wall

all:	hello

hello:	main.o factorial.o hello.o
	$(CC) main.o factorial.o hello.o -o hello
main.o:	main.cpp
	$(CC) $(CFLAGS) main.cpp
factorial.o:	factorial.cpp
	$(CC) $(CFLAGS) factorial.cpp
hello.o:	hello.cpp
	$(CC) $(CFLAGS) hello.cpp
clean:
	rm -rf *o hello
```

### ตัวอย่างไฟล์ Makefile อย่างง่ายแบบที่ 3

สร้างตัวแปร SOURCES, OBJECTS และ EXECUTABLE เพื่อรวมไฟล์โปรแกรมเข้าด้วยกัน

```c
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all:	$(SOURCES) $(EXECUTABLE)
	
$(EXECUTABLE): $(OBJECTS) 
	$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
	$(CC) $(CFLAGS) $< -o $@
clean:
	rm -rf $(OBJECTS) $(EXECUTABLE)
```

### ตัวอย่างไฟล์ Makefile อย่างง่ายแบบที่ 4

ในกรณีที่มีการอ้างอิง (include) ไฟล์ header (.h) เพิ่มหรือไลบรารีภายนอกเพิ่มเติม จะต้องใส่ option -I และ -l เพิ่มเข้าไป

```c
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
MY_INCLUDES=/home/student/project/myLib/
MY_LIBRARIES=zlib fltk
EXECUTABLE=hello

all:	$(SOURCES) $(EXECUTABLE)
	
$(EXECUTABLE):	$(OBJECTS) 
	$(CC) -I$(MY_INCLUDES) $(LDFLAGS) $(OBJECTS) -o $@ -l$(MY_LIBRARIES)
@echo "Compile hello completed..." 
.cpp.o:
	$(CC) $(CFLAGS) $< -o $@
@echo "Compile all object files completed..."
clean:
	rm -rf $(OBJECTS) $(EXECUTABLE)
@echo "Clean all object files and hello program done..."
```
