์ƒˆ์†Œ์‹

๐Ÿ‘ฉ‍๐Ÿ’ป C

(shell) - Makefile ์ด๋ž€ ? gcc, g++๊ณผ makefile์˜ ์ฐจ์ด? ๋ณ€์ˆ˜ ์„ค์ •

  • -

์œˆ๋„์šฐ์—์„œ๋Š” ๋น„์ฅฌ์–ผ ์ŠคํŠœ๋””์˜ค๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ปดํŒŒ์ผํ•˜์ง€๋งŒ, ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ make๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

1. makefile ์ด๋ž€?

Shell์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ด๋‹ค.

makefile์ด๋ผ๋Š” ํŒŒ์ผ์—, ์–ด๋–ค ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š”์ง€, ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ• ์ง€ ์ž‘์„ฑํ•ด๋†“๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  make๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด makefile ์ด ๋“ค์–ด์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํŒŒ์ผ๋“ค์˜ ์ข…์†๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ž๋™์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, makefile๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ• ๋•Œ, ์ž๋™ํ™”๋กœ ์ธํ•ด ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์˜ ์ข…์† ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. + ๋งŒ์•ฝ ํ”„๋กœ๊ทธ๋žจ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ์ปดํŒŒ์ผ ํ•˜๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

 

2. gcc๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ปดํŒŒ์ผ์˜ ์ˆœ์„œ (make์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋“œ ์ ˆ์ฐจ)

์ผ๋ฐ˜์ ์œผ๋กœ gcc , g++, clang ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํ•  ๋•Œ์˜ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋งŒ์•ฝ์— ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ๋“ค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด,

  • main.c
#include "f1.h" // ํ˜„์žฌ๊ฒฝ๋กœ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Œ๋”ฐ์˜ดํ‘œ + ํ—ค๋”ํŒŒ์ผ์ด๋ฆ„ ์œผ๋กœ includeํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
#include "f2.h"

int main(void)
{
	f1();
    f2();
}
  • f1.c
#include <stdio.h>
void f1()
{
	printf("this is f1");
}
  • f2.c
#include <stdio.h>
void f1()
{
	printf("this is f1");
}
  • f1.h
void f1(); //ํ—ค๋”ํŒŒ์ผ์—๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ + ํ•จ์ˆ˜๋ช…์„ ์ ๋Š”๋‹ค.
  • f2.h
void f2();

 

ํŒŒ์ผ์„ ๋‹ค ์ž‘์„ฑํ–ˆ์œผ๋ฉด, ์ปดํŒŒ์ผ ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. (ํ—ค๋”ํŒŒ์ผ๋“ค์€ main.c ํŒŒ์ผ์—์„œ ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋”ฐ๋กœ ์ปดํŒŒ์ผ ํ• ๋•Œ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.)

$ gcc -c main.c f1.c f2.c

 

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.

  • main.o
  • f1.o
  • f2.o
$ gcc main.o f1.o f2.o

๋‹ค์Œ์œผ๋กœ๋Š” ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ์˜ค๋ธŒ์ ํŠธํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐ์‹œํ‚จ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ณผ์ •์€ "๋งํ‚น"์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

๋”ฐ๋กœ ํŒŒ์ผ๋ช…์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด a.out์ด๋ผ๋Š” ํŒŒ์ผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

$ ./a.out

์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

3. Makefile ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ธฐ

makefile์€ 3๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Target (ํƒ€๊ฒŸ)
  • Prerequisites (ํ•„์š”ํ•œ ์กฐ๊ฑด๋“ค)  || ํ˜น์€ Dependency : Target์ด ์˜์กดํ•˜๋Š” ํŒŒ์ผ๋“ค
  • Recipes (์‹คํ–‰ํ•  ๋ช…๋ น์–ด) || ํ˜น์€ Command (๋ช…๋ น์–ด)
target ... : prerequisites ...
	recipe
    	...
        ...
        ...
//recipe ์•ž์€ ๋ฐ˜๋“œ์‹œ tabํ‚ค๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

 

๊ทธ๋Ÿผ ๋ชฉ์ฐจ 2๋ฒˆ์—์„œ ํ–ˆ๋˜ ๋นŒ๋“œ๊ณผ์ •์œผ๋กœ ์˜ˆ๋ฅผ๋“ค์–ด์„œ makefile์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด

makefile

f1.o : f1.h f1.c
	gcc -c f1.c
    
f2.o : f2.h f2.c
	gcc -c f2.c
    
main.o : main.c f1.h f2.h
	gcc -c main.c

main : f1.o f2.o main.o
	gcc f1.o f2.o main.o

๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ๋ฐ˜๋“œ์‹œ tab์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค. 

$ make main

make ๋ช…๋ น์„ ํ†ตํ•ด ๋นŒ๋“œํ•˜๋ฉด 2๋ฒˆ์—์„œ ํ–ˆ๋˜ ๊ณผ์ •๋“ค(์ปดํŒŒ์ผ + ๋งํ‚น)์ด ๊ทธ๋Œ€๋กœ ๋นŒ๋“œ๋œ๋‹ค.

 

3 - 1  . makefile ๋‚ด์—์„œ ๋ณ€์ˆ˜ ์ •์˜ํ•˜๊ธฐ

g = gcc

f1.o : f1.h f1.o
	$(g) -c f1.c

๋ณ€์ˆ˜๋Š” ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค. ์‚ฌ์šฉํ• ๋•Œ๋Š” $(๋ณ€์ˆ˜๋ช…) ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

4 - 2 . PHONY

makefile ๋‚ด์— ํ”ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ clean์ด ์žˆ๋‹ค. clean์€ ๋นŒ๋“œ์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค (์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ)์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์„ ๋„ฃ๋Š”๋‹ค.

clean:
	rm -rf $(OBJS) main

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ๋•Œ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ make clean ์ด๋ผ๊ณ  ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, clean์ด๋ผ๋Š” ํŒŒ์ผ์ด ๋””๋ ‰ํ† ๋ฆฌ๋‚ด์— ์กด์žฌํ•  ๊ฒฝ์šฐ์—๋Š” ๋ช…๋ น์ด ๋ฌด์‹œ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ PHONY์— ๋“ฑ๋กํ•œ๋‹ค.

.PHONY: clean
clean:
	rm -f $(OBJS) main

PHONY์— ๋“ฑ๋ก๋œ ๋ช…๋ น์–ด๋Š”, ๋™์ผ ์ด๋ฆ„์˜ ํŒŒ์ผ ์กด์žฌ์—ฌ๋ถ€๊ณผ ๊ด€๊ณ„ ์—†์ด ํ•ญ์ƒ ํƒ€๊ฒŸ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

4 - 3. ํŒจํ„ด ์‚ฌ์šฉ

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐฉ๋Œ€ํ•ด์ง„๋‹ค๋ฉด, ์ž๋™ํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด makefile๋‚ด์— recipe์„ ์ž‘์„ฑํ• ๋•Œ๋„ ๋งŽ์€ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.(ํŒŒ์ผ๋ช…๋งŒ ๋ฐ”๊พธ์–ด ๋ฐ˜๋ณต์ ์ด๊ณ  ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…) ์ด๋ฅผ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

* ํŒจํ„ด์€ target๊ณผ prerequisite ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ recipe์—์„œ๋Š” "์ž๋™ ๋ณ€์ˆ˜"๋ผ๋Š” ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

* ์ž๋™ ๋ณ€์ˆ˜

  • $@ : ํƒ€๊ฒŸ ์ด๋ฆ„์— ๋Œ€์‘๋œ๋‹ค. (ex : f1.o)
  • $< : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€์‘๋œ๋‹ค. (ex : f1.c)
  • $^ : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก ์ „์ฒด์— ๋Œ€์‘๋œ๋‹ค. (ex : f1.c , f1.h)
ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „
f1.o : f1.c f1.h
	gcc -c f1.c
f2.o : f2.c f2.h
	gcc -c f2.c

 

ํŒจํ„ด ์‚ฌ์šฉ ํ›„
%.o: %.c %.h
	gcc -c $<

%.o ๋Š” ์™€์ผ๋“œ์นด๋“œ์— ๋Œ€์‘์‹œํ‚ค๋ฉด *.o์™€ ๊ฐ™๋‹ค. ํ™•์žฅ์ž๊ฐ€ o์ธ ๋ชจ๋“  ํŒŒ์ผ์„ ํƒ€๊ฒŸ์œผ๋กœ ์‚ผ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

* ์ž๋™ prerequisite ์ƒ์„ฑ

์ปดํŒŒ์ผ์‹œ -MD์˜ต์…˜์„ ์ฃผ๋ฉด, dํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” ์ž๋™์ ์œผ๋กœ ๋ชฉ์ ํŒŒ์ผ๊ณผ ์ปดํŒŒ์ผํ•œ ์†Œ์ŠคํŒŒ์ผ์„ ํƒ€๊ฒŸ์œผ๋กœ ์‚ผ๋Š” ์˜์กดํŒŒ์ผ๋“ค์„ ๋‹ด์€ ๋ชฉ๋ก์„ ๋‹ด๊ณ ์žˆ๋‹ค.

$ gcc -c -MD main.c
>>>>> main.d ํŒŒ์ผ ์ƒ์„ฑ๋จ

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ makefile์—์„œ ์ž๋™์ ์œผ๋กœ prerequisite๋ฅผ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.

OBJS = f1.o f2.o main.o
%.o : %.c
	gcc -c $<
    
main : $(OBJS)
	gcc -o main
    
.PHONY: clean
clean:
	rm -f $(OBJS) main
    
-include $(OBJS:.o=.d)

OBJS์˜ oํ™•์žฅ์ž๋ฅผ ๊ฐ–๋Š” ํŒŒ์ผ๋“ค์„ d๋กœ ๋Œ€์ฒดํ•˜๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 


 

์ฐธ์กฐ

modoocode.com/311

 

์”น์–ด๋จน๋Š” C++ - <19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)>

 

modoocode.com

 

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.