๐Ÿ•ท๏ธ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 138 (from laksa040)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

โ„น๏ธ Skipped - page is already crawled

๐Ÿ“„
INDEXABLE
โœ…
CRAWLED
8 days ago
๐Ÿค–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.3 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://modoocode.com/311
Last Crawled2026-03-30 07:37:32 (8 days ago)
First Indexed2020-06-10 13:51:41 (5 years ago)
HTTP Status Code200
Meta Title์”น์–ด๋จน๋Š” C++ - <19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)>
Meta Descriptionnull
Meta Canonicalnull
Boilerpipe Text
์ž‘์„ฑ์ผ : 2020-06-10 ์ด ๊ธ€์€ 105837 ๋ฒˆ ์ฝํ˜”์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์—์„œ๋Š” make ์˜ ์ž‘๋™ ์ดํ•ด Makefile ๋ฌธ๋ฒ• ์ดํ•ด ๋งŒ๋Šฅ Makefile ๋งŒ๋“ค๊ธฐ ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ๊ฐ•์ขŒ ๋ถ€ํ„ฐ๋Š” ์”น์–ด๋จน๋Š” C++ ์‹œ๋ฆฌ์ฆˆ์˜ ๋ถ€๋ก ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ C++ ์–ธ์–ด ์ž์ฒด์™€๋Š” ์ง์ ‘ ๊ด€๋ จ์€ ์—†์ง€๋งŒ ์‹ค์ œ๋กœ C++ ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ง€์‹๋“ค๊ณผ ํˆด๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฒซ ๋ฒˆ์งธ ํƒ€์ž๋กœ Makefile ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์‹  ๋ถ„๋“ค์€ ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ์—์„œ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ์ปดํŒŒ์ผ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•Œ์•„์„œ ์ปดํŒŒ์ผ ๋˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์‰˜ ์ƒ์—์„œ ์ปดํŒŒ์ผ์„ ํ•˜๋ ค๋ฉด ์–ด๋–ค ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ณ , ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ง€ ์ง์ ‘ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๋ฌผ๋ก  ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ํŒŒ์ผ๋“ค์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ๋งค๋ฒˆ ๊ทธ๋ ‡๊ฒŒ ์นœ๋‹ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ํ”„๋กœ๊ทธ๋žจ์€ Makefile ๋ผ๋Š” ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ฃผ์–ด์ง„ ๋ฐฉ์‹๋Œ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ๋“ค์„ ๋ช…๋ น์–ด ํ•œ ๋ฒˆ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” make ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ Makefile ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € make ๊ฐ€ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์™„์„ฑ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ์—ฌ๋Ÿฌ๋ถ„์˜ ๋จธ๋ฆฌ ์†์œผ๋กœ ๋– ์˜ค๋ฅด๋Š” ๊ณผ์ •์€ ๋ฐ”๋กœ ์ปดํŒŒ์ผ(Compile) ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ์ด๋ผ๋Š” ๊ณผ์ •์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด foo.h ์— ์ •์˜๋œ foo ํ•จ์ˆ˜์™€ bar.h ์— ์ •์˜๋œ bar ํ•จ์ˆ˜๋ฅผ main ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. foo.h int foo (); foo.cc #include <iostream> #include "foo.h" int foo () { std :: cout << "Foo!" << std :: endl; return 0 ; } bar.h int bar (); bar.cc #include <iostream> #include "bar.h" int bar () { std :: cout << "Bar!" << std :: endl; return 0 ; } main.cc #include "bar.h" #include "foo.h" int main () { foo (); bar (); } ์˜ˆ๋ฅผ ๋“ค์–ด์„œ main.cc ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. $ g++ -c main.cc g++ ์— ์ „๋‹ฌํ•˜๋Š” -c ๋ช…๋ น์–ด๋Š” ์ธ์ž ๋‹ค์Œ์— ์ฃผ์–ด์ง€๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•ด์„œ ๋ชฉ์  ํŒŒ์ผ(object file) ์„ ์ƒ์„ฑํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜์˜€๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด main.o ๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $ ls main.o main.o ์ด main.o ๋Š” main.cc ๋ฅผ ์ปดํŒŒ์ผ ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ main.o ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด $ objdump -S main.o main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 push %rbp 5: 48 89 e5 mov %rsp,%rbp 8: e8 00 00 00 00 callq d <main+0xd> d: e8 00 00 00 00 callq 12 <main+0x12> 12: b8 00 00 00 00 mov $0x0,%eax 17: 5d pop %rbp 18: c3 retq ์™€ ๊ฐ™์ด main.cc ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋“ค์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ main.cc ๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ main.o ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์Šฌ์ฉ ๋ณด๋ฉด foo ๋‚˜ bar ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ํ•˜๋‚˜๋„ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ main.o ์ž์ฒด๋กœ๋Š” ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด main.o ์—๋Š” foo ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ผ! ๋ผ๋Š” ๋‚ด์šฉ๋งŒ ์žˆ์ง€, foo ๋Š” ์–ด๋””์— ์žˆ๊ณ  ์ด๋Ÿฌ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” foo ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” foo.cc ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ foo.o ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bar ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” bar.cc ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“  bar.o ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ฐ๊ฐ์˜ main.o, foo.o, bar.o ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ฒ ์ฃ . ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋งํ‚น(Linking) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋งํ‚น์ด ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋งํฌ ํ•˜๋Š” ์ž‘์—… ์ธ ์ด์œ ๋Š” ์‹ค์ œ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ํฉ์–ด์ ธ ์žˆ๋˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋“ค์„ ํ•œ ๋ฐ ๋ฌถ์–ด์„œ ๋งํฌํ•ด์ฃผ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ๊ณผ์ •์—์„œ main ํ•จ์ˆ˜ ์•ˆ์— foo ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ์œ„์น˜๋ฅผ ์ฐพ๊ณ  ์ œ๋Œ€๋กœ ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋งํ‚น์— ๊ด€ํ•ด์„œ ์ด์•ผ๊ธฐ๋งŒ ํ•ด๋„ ํ•œ์ฐธ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋‹จ ์ด ๊ธ€์˜ ๋ชฉํ‘œ๋Š” ๋นŒ๋“œ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ค„์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋งํ‚น ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ชฉ์ ํŒŒ์ผ์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. $ g++ main.o foo.o bar.o -o main ์—ฌ๊ธฐ์„œ -o ์˜ต์…˜์€ ๊ทธ ๋’ค์— ๋งํ‚น ํ›„์— ์ƒ์„ฑํ•  ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ main ์ด๋ผ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๊ณ  ๋งŒ์•ฝ์— ์ด๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๋ƒฅ ./a.out ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋””ํดํŠธ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ main ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ Foo! Bar! ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ผ๋‹จ ์œ„์™€ ๊ฐ™์ด main ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋ ฅํ•œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ญ‰ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด; $ g++ -c main.cc $ g++ -c foo.cc $ g++ -c bar.cc $ g++ main.o foo.o bar.o -o main ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด ๋งค ๋ฒˆ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค๋งŒ, ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์ณ์•ผํ•  ๋ช…๋ น์–ด๊ฐ€ ๋” ๋งŽ์•„์ง€๊ฒŒ ๋˜์„œ ๋ณต์žกํ•˜๊ฒ ์ง€์š” (ํŠนํžˆ ํŒŒ์ผ๋“ค์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š”๋‹ค๋ฉด ๋ง์ด์ฃ .) ๋ฌผ๋ก  ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์กฐ๊ธˆ ์•„์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์œ„ ๋ช…๋ น์–ด๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋ผ๊ณ  ๋ฌผ์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค๋ฉด ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์—ฌ๋Ÿฌ๋ถ„์ด main.cc ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ๋Š” $ g++ -c main.cc $ g++ main.o foo.o bar.o -o main ๋”ฑ ์ด ๋‘ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด main ํŒŒ์ผ์„ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด์„œ foo ๋‚˜ bar ์˜ ์ปดํŒŒ์ผ ๋œ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•˜์ง€๋งŒ ์œ„ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๊ฒŒ ๋œ๋‹ค๋ฉด ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”๋„ ์ „์ฒด ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋งค์šฐ ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ make ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๋ช…๋ น๋งŒ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ž ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  make ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ make ๋ฅผ ์œ„ํ•œ Makefile ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. make ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์ฃผ์–ด์ง„ ์‰˜ ๋ช…๋ น์–ด๋“ค์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์–ด๋– ํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋‹ด์€ ํŒŒ์ผ์„ Makefile ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, make ๋ฅผ ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” Makefile ์„ ์ฐพ์•„์„œ ์ฝ์–ด๋“ค์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Makefile ์—๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ฑด์„ ๊ธฐ์ˆ ํ• ๊นŒ์š”? target โ€ฆ : prerequisites โ€ฆ (ํƒญ)recipe โ€ฆ โ€ฆ Makefile ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด 3 ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. make ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ make abc ๊ณผ ๊ฐ™์ด ์–ด๋– ํ•œ ๊ฒƒ์„ make ํ•  ์ง€ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ํƒ€๊ฒŸ(target) ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์ผ make abc ๋ฅผ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํƒ€๊ฒŸ ์ค‘์— abc ๋ฅผ ์ฐพ์•„์„œ ์ด์— ๋Œ€์‘๋˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋“ค์˜ ๋‚˜์—ด์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์€ recipe ์ž๋ฆฌ์— ๋ช…๋ น์–ด๋ฅผ ์“ธ ๋•Œ ๋ฐ˜๋“œ์‹œ ํƒญ ํ•œ ๋ฒˆ์œผ๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•ด์ค˜์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค . ๋ณดํ†ต ์š”์ฆ˜์˜ ํŽธ์ง‘๊ธฐ์˜ ๊ฒฝ์šฐ (์˜ˆ๋ฅผ ๋“ค์–ด VSCode), ์ž๋™์œผ๋กœ ํƒญ์„ ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์„ ํ…๋ฐ make ๊ฐ€ Makefile ์„ ์ œ๋Œ€๋กœ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํƒญ์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค! ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‚ฌ์šฉ๋  ํŒŒ์ผ๋“ค์˜ ๋ชฉ๋ก ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ์˜์กด ํŒŒ์ผ(dependency) ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด๋“œ๋ ค์•ผ ํ•  ํŒŒ์ผ๋“ค์„ ์จ๋†“์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ ์ฃผ์–ด์ง„ ํŒŒ์ผ๋“ค์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ํƒ€๊ฒŸ์ด ๋” ๋‚˜์ค‘์— ์ˆ˜์ •๋˜์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ์ด์ „์— ํƒ€๊ฒŸ์ด ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํƒ€๊ฒŸ์ด main.o ์ด๊ณ , ๋ช…๋ น์–ด๊ฐ€ g++ -c main.cc ๋ผ๋ฉด, ํ•„์š” ์กฐ๊ฑด๋“ค์€ main.cc , foo.h , bar.h ๊ฐ€ ๋˜๊ฒ ์ฃ . ์™œ๋ƒํ•˜๋ฉด ์ด๋“ค ํŒŒ์ผ๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐ”๋€๋‹ค๋ฉด main ์„ ์ƒˆ๋กœ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ฐ˜๋ฉด์— main.o ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด main.cc , foo.h , bar.h ๋“ค์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋ผ๋ฉด, ๊ตณ์ด main.o ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Makefile ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. foo.o : foo.h foo.cc g++ -c foo.cc bar.o : bar.h bar.cc g++ -c bar.cc main.o : main.cc foo.h bar.h g++ -c main.cc main : foo.o bar.o main.o g++ foo.o bar.o main.o -o main ์ฃผ์˜ ์‚ฌํ•ญ ์œ„ Makefile ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์•„๋งˆ ์‹คํ–‰์ด ์•ˆ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒญ์ด ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๋€Œ์–ด์„œ ๊ทธ๋Ÿฐ๋ฐ์š”, ์ œ๋Œ€๋กœ Makefile ์„ ๋งŒ๋“œ์‹œ๊ธฐ ์œ„ํ•ด์„œ๋Š” g++ ์•ž์— ์˜ค๋Š” ์ŠคํŽ˜์ด์Šค ๋‘ ๋ฒˆ์„ ํƒญ์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์ €์žฅํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์ธ main ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— make main ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด $ make main g++ -c foo.cc g++ -c bar.cc g++ -c main.cc g++ foo.o bar.o main.o -o main ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ main ์ด ์ž˜ ๋งŒ๋“ค์–ด์ง์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ํ•œ ๋ฒˆ๋„ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ make main ์„ ์‹คํ–‰ํ•˜๋ฉด make ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. make main ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด main ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. ์˜ค. main ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด foo.o bar.o main.o ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. foo.o ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด foo.cc ๋„ค? ์•„์ง foo.o ๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฒ ๊ตฐ! ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bar.o, main.o ๋„ ์ปดํŒŒ์ผ ์ž ์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ g++ foo.o bar.o main.o -o main ๋ฅผ ์‹คํ–‰ํ•ด์•ผ์ง€ ๋งŒ์•ฝ์— ์—ฌ๋Ÿฌ๋ถ„์ด make main ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ์ƒํƒœ์—์„œ foo.cc ๋งŒ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์žฌ์ปดํŒŒ์ผ ๋ฉ๋‹ˆ๋‹ค. make main ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด main ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. ์˜ค. main ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด foo.o bar.o main.o ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. foo.o ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด foo.cc ๋„ค? ๊ทธ๋Ÿฐ๋ฐ foo.o ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„ ๋ณด๋‹ค foo.cc ์˜ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋” ๋‚˜์ค‘์ด๊ตฐ! ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด bar.o ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด bar.cc ์ธ๋ฐ, bar.o ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด bar.cc ์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋„ค. ๊ตณ์ด ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒ ์–ด main.o ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์‹œ ์•ˆ๋ฐ”๊ฟ”๋„ ๋˜๊ฒ ๊ตฐ! main ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค ์ค‘ foo.o ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ ๋‚ด ๋ช…๋ น์–ด๋“ค๋„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด. ๋”ฐ๋ผ์„œ ๋”ฑ ํ•„์š”ํ•œ g++ -c foo.cc ์™€ g++ foo.o bar.o main.o -o main ๋งŒ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์žฌ๋ฏธ์žˆ๊ฒŒ๋„ Makefile ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CC = g++ ์œ„ ๊ฒฝ์šฐ CC ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๋Š”๋ฐ, ์ด์ œ Makefile ๋‚ด์—์„œ CC ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฌธ์ž์—ด์ธ g++ ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” $(CC) ์™€ ๊ฐ™์ด $() ์•ˆ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ CC = g++ foo.o : foo.h foo.cc $(CC) -c foo.cc ๋Š” ์‚ฌ์‹ค CC = g++ foo.o : foo.h foo.cc g++ -c foo.cc ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ช…๋ น์ด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ์ด ๋ถ€๋ถ„์€ TMI ์ด๋ฏ€๋กœ ๋ฐ”์˜์‹  ๋ถ„๋“ค์€ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค. Makefile ์ƒ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ = ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ := ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ์‚ด์ง ๋‹ค๋ฆ…๋‹ˆ๋‹ค. = ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€์„ ๋•Œ, ์ •์˜์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜๊ธฐ ๋  ๋•Œ ๊นŒ์ง€ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ •ํ•ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ B = $(A) C = $(B) A = a C ์˜ ๊ฒฝ์šฐ B ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ , B ์˜ ๊ฒฝ์šฐ A ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ B = ๋ฅผ ์‹คํ–‰ํ•œ ์‹œ์ ์—์„œ A ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ B ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ = ๋กœ ์ •์˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— A ๊ฐ€ ์‹ค์ œ๋กœ ์ •์˜๋  ๋•Œ ๊นŒ์ง€ B ์™€ C ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰์— A = a ๋ฅผ ํ†ตํ•ด A ๊ฐ€ a ๋กœ ๋Œ€์‘๋˜์–ด์•ผ, C ๊ฐ€ a ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. B := $(A) A = a ๋ฐ˜๋ฉด์— := ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹œ์ ์—์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ B ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๊ฒ ์ง€์š”. ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ๋Š” = ๋‚˜ := ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์ผ ๋ณ€์ˆ˜๋“ค์˜ ์ •์˜ ์ˆœ์„œ์— ํฌ๊ฒŒ ๊ตฌ์• ๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด = ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค. A = ์™€ ๊ฐ™์ด ์ž๊ธฐ ์ž์‹ ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด := ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ์ง€ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ ๋ช…์‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋“ค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Makefile ์„ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main make ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด $ make main g++ -Wall -O2 -c foo.cc g++ -Wall -O2 -c bar.cc g++ -Wall -O2 -c main.cc g++ -Wall -O2 foo.o bar.o main.o -o main ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. CC ์™€ CXXFLAGS ๋Š” Makefile ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ๋ณดํ†ต CC ์—๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ด๋ฆ„์„, CXXFLAGS ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ฃผ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์  ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด๋Š” C++ ์˜ ๊ฒฝ์šฐ ์ด๊ณ , C ์˜ ๊ฒฝ์šฐ CFLAGS ์— ์˜ต์…˜์„ ์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ g++ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ต์…˜์œผ๋กœ๋Š” Wall (๋ชจ๋“  ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ) ๊ณผ O2 (์ตœ์ ํ™” ๋ ˆ๋ฒจ 2) ๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Makefile ์— ํ”ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋นŒ๋“œ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค (.o ํŒŒ์ผ๋“ค)์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. clean: rm -f $(OBJS) main ์‹ค์ œ๋กœ make clean ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ชฉ์  ํŒŒ์ผ๊ณผ main ์„ ์ง€์›Œ๋ฒ„๋ฆผ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ์— ์‹ค์ œ๋กœ clean ์ด๋ผ๋Š” ํŒŒ์ผ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ make clean ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, make ๋Š” clean ์˜ ํ•„์š” ํŒŒ์ผ๋“ค์ด ์—†๋Š”๋ฐ, clean ํŒŒ์ผ์ด ์žˆ์œผ๋‹ˆ๊นŒ clean ํŒŒ์ผ์€ ํ•ญ์ƒ ์ตœ์‹ ์ด๋„ค? recipe ๋ฅผ ์‹คํ–‰ ์•ˆํ•ด๋„ ๋˜๊ฒ ๋„ค! ํ•˜๋ฉด์„œ ๊ทธ๋ƒฅ make clean ๋ช…๋ น์„ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. $ ls clean clean $ make clean make: 'clean' is up to date. ์‹ค์ œ๋กœ ๋””๋ ‰ํ† ๋ฆฌ์— clean ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋†“๊ณ  ์‹คํ–‰ํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ clean ์€ ์ตœ์‹ ์ด๋ผ๋ฉฐ recipe ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” clean ์„ PHONY ๋ผ๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ง€์š”. .PHONY: clean clean: rm -f $(OBJS) main ์ด์ œ make clean ์„ ํ•˜๊ฒŒ ๋˜๋ฉด clean ํŒŒ์ผ์˜ ์œ ๋ฌด์™€ ์ƒ๊ด€ ์—†์ด ์–ธ์ œ๋‚˜ ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์ด 3 ๊ฐœ ๋ฐ–์— ์—†์–ด์„œ ๋‹คํ–‰์ด์˜€์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ˆ˜์‹ญ~ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ฐ๊ฐ์˜ ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ ๋นŒ๋“œ ๋ฐฉ์‹์„ ๋ช…์‹œํ•ด์ค€๋‹ค๋ฉด Makefile ์˜ ํฌ๊ธฐ๊ฐ€ ์—„์ฒญ ์ปค์ง€๊ฒ ์ง€์š”. ๋‹คํ–‰์ด๋„ Makefile ์—์„œ๋Š” ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด์„œ ํŠน์ • ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ recipe ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc ์ผ๋‹จ ๋จผ์ € ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด ์œ„ ๋‘ ๋ช…๋ น๋“ค์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ๋จผ์ € %.o ๋Š” ์™€์ผ๋“œ์นด๋“œ๋กœ ๋”ฐ์ง€๋ฉด ๋งˆ์น˜ *.o ์™€ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, .o ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„๋“ค์ด ํƒ€๊ฒŸ์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ง€์š”. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ foo.o ๊ฐ€ ํƒ€๊ฒŸ์ด๋ผ๋ฉด % ์—๋Š” foo ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ  bar.o ์˜ ๊ฒฝ์šฐ % ์—๋Š” bar ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด foo.o ๊ฐ€ ํƒ€๊ฒŸ์ผ ๊ฒฝ์šฐ foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c $< ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ํŒจํ„ด์€ ํƒ€๊ฒŸ๊ณผ prerequisite ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. recipe ๋ถ€๋ถ„์—์„œ๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— foo.cc ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Makefile ์˜ ์ž๋™ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. $< ์˜ ๊ฒฝ์šฐ prerequisite ์—์„œ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์˜ ์ด๋ฆ„์— ๋Œ€์‘๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ foo.cc ๊ฐ€ ๋˜๊ฒ ์ง€์š”. ๋”ฐ๋ผ์„œ ์œ„ ๋ช…๋ น์–ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c foo.cc ๊ฐ€ ๋˜์–ด์„œ ์ด์ „์˜ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. Makefile ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๋ณ€์ˆ˜๋กœ๋Š” ๊ทธ ์™ธ์—๋„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด $@ , $< , $^ ๋“ฑ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. $@ : ํƒ€๊ฒŸ ์ด๋ฆ„์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. $< : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. $^ : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก ์ „์ฒด์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. $? : ํƒ€๊ฒŸ ๋ณด๋‹ค ์ตœ์‹ ์ธ ์˜์กด ํŒŒ์ผ๋“ค์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. $+ : $^ ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ค‘๋ณต๋œ ํŒŒ์ผ ์ด๋ฆ„๋“ค ๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์œ„ ํŒจํ„ด์œผ๋กœ๋Š” main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— main.h ๊ฐ€ ์—†๊ณ  foo.h ์™€ bar.h ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‚ฌ์‹ค ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ๋Š” ํ•ด๋‹น ์†Œ์Šค ํŒŒ์ผ์ด ์–ด๋– ํ•œ ํ—ค๋”ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ƒ์— ๊ฒฐ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. main.cc ๊ฐ€ foo.h ์™€ bar.h ๋ฅผ include ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— main.o ์˜ prerequisite ๋กœ main.cc ์™ธ์—๋„ foo.h ์™€ bar.h ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ์ผ์ผํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์†Œ์Šค ํŒŒ์ผ์— ํ—ค๋” ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค Makefile ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†๋Š” ๋…ธ๋ฆ‡์ด๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ๋‹คํ–‰์ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€์„ ๋ฐ›์•„์„œ ์˜์กดํŒŒ์ผ ๋ชฉ๋ก ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— -MD ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ์ปดํŒŒ์ผ ํ•ด๋ด…์‹œ๋‹ค. $ g++ -c -MD main.cc ๊ทธ๋ ‡๋‹ค๋ฉด main.d ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ฉด; $ cat main.d main.o: main.cc /usr/include/stdc-predef.h foo.h bar.h ๋†€๋ž๊ฒŒ๋„ ๋งˆ์น˜ Makefile ์˜ target: prerequisite ์ธ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— -MD ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, ๋ชฉ์  ํŒŒ์ผ ๋ง๊ณ ๋„ ์ปดํŒŒ์ผ ํ•œ ์†Œ์ŠคํŒŒ์ผ์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š” ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์„ ๋‹ด์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ main.cc, foo.h, bar.h ๊นŒ์ง€๋Š” ์ดํ•ด๊ฐ€ ๊ฐ€๋Š”๋ฐ ์™œ ์ƒ๋šฑ๋งž์€ /usr/include/stdc-predef.h ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํŒŒ์ผ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ main.d ๋ฅผ ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ์˜ Makefile ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋ƒ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main include main.d ์œ„ include main.d ๋Š” main.d ๋ผ๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ Makefile ์— ํฌํ•จํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„์‹ธ๋ฆฌ %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ๋ถ€๋ถ„์„ ์•„์˜ˆ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ .d ํŒŒ์ผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”? ๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค! CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main -include $(OBJS:.o=.d) $(OBJS:.o=.d) ๋ถ€๋ถ„์€ OBJS ์—์„œ .o ๋กœ ๋๋‚˜๋Š” ๋ถ€๋ถ„์„ .d ๋กœ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ถ€๋ถ„์€ -include foo.d bar.d main.d ๊ฐ€ ๋˜๊ฒ ์ฃ . ์ฐธ๊ณ ๋กœ foo.d ๋‚˜ bar.d ๊ฐ€ include ๋  ๋•Œ ์ด๋ฏธ ์žˆ๋Š” %.o: %.cc ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ฐ™์€ ํƒ€๊ฒŸ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก๋“ค์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค๋ฉด ์ด๋Š” make ์— ์˜ํ•ด ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ง๋ถ™์—ฌ include ์—์„œ -include ๋กœ ๋ฐ”๊พธ์—ˆ๋Š”๋ฐ, -include ์˜ ๊ฒฝ์šฐ ํฌํ•จํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ make ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์— make ๋ฅผ ํ•  ๋•Œ์—๋Š” .d ํŒŒ์ผ๋“ค์ด ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— include ๊ฐ€ ์•„๋ฌด๋Ÿฐ .d ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํฌ๊ฒŒ ๋ฌธ์ œ ์—†๋Š” ๊ฒƒ์ด ์–ด์ฐจํ”ผ .o ํŒŒ์ผ๋“ค๋„ make ๊ฐ€ %.o: %.cc ๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์— make ๋ฅผ ํ•˜๊ฒŒ ๋  ๋•Œ์—๋Š” ์ œ๋Œ€๋กœ .d ํŒŒ์ผ๋“ค์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. $ tree . โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ bar.h โ”œโ”€โ”€ foo.cc โ”œโ”€โ”€ foo.h โ””โ”€โ”€ main.cc ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์€ src ์— ๋“ค์–ด๊ฐ€๊ณ  ๋นŒ๋“œ ํŒŒ์ผ๋“ค์€ obj ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ข…์ข… ํ—ค๋” ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ include ์— ๋นผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ €๋Š” ๊ตณ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณ„๋กœ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ตณ์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์„ ์ด์œ ๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) ์•„๋ฌดํŠผ ์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋Šฅ Makefile ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ๋ณต์‚ฌํ•œ ํ›„์— $(CC) ์™€ rm ์•ž์— ์ŠคํŽ˜์ด์Šค ๋‘ ๊ฐœ๋ฅผ ๊ผญ TAB ์œผ๋กœ ์น˜ํ™˜ํ•ด์ฃผ์„ธ์š”! ์•ˆ ๊ทธ๋Ÿฌ๋ฉด make ๊ฐ€ ์ฝ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„๋งŒ ๊ฐ„๋‹จํžˆ ๋ถ€์—ฐ ์„ค๋ช…์„ ํ•˜์ž๋ฉด # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) ๋จผ์ € SRC_DIR ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ SRCS ๋กœ ์ฝ์–ด๋“ค์ด๋ ค ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. wildcard ๋Š” ํ•จ์ˆ˜๋กœ ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ํŒŒ์ผ๋“ค์„ ๋ฝ‘์•„๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ foo.cc, bar.cc, main.cc ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ $(wildcard $(SRC_DIR)/*.cc) ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ./src/foo.cc ./src/bar.cc ./src/main.cc ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” foo.cc bar.cc main.cc ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด notdir ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. notdir ์€ ์•ž์— ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์ถ”์ถœํ•ด์ค๋‹ˆ๋‹ค. OBJS = $(SRCS:.cc=.o) ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์—์„œ OBJS ๋Š” foo.o bar.o main.o ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด OBJS ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ .o ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ด๋“ค ํŒŒ์ผ ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์—ฌ์ค˜์•ผ ๊ฒ ์ง€์š”. ์ด๋ฅผ ์œ„ํ•ด์„  patsubst ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) patsubst ํ•จ์ˆ˜๋Š” $(patsubst ํŒจํ„ด,์น˜ํ™˜ ํ›„ ํ˜•ํƒœ,๋ณ€์ˆ˜) ์˜ ๊ฐ™์€ ๊ผด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ $(OBJS) ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  %.o ํŒจํ„ด์„ $(OBJ_DIR)/%.o ๋กœ ์น˜ํ™˜ํ•ด๋ผ ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ๋•๋ถ„์— OBJECTS ์—๋Š” ์ด์ œ . /obj/foo.o ./obj/bar.o ./obj/main.o ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค์— ๋‚ด์šฉ์€ ์•ž์˜ ๊ธ€์„ ์ž˜ ๋”ฐ๋ผ ์˜ค์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์ž˜ ์ดํ•ด ํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ํ—ค๋” ํŒŒ์ผ๋“ค๋งŒ ๋”ฐ๋กœ ๋ฝ‘๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒ ์ฃ . $ tree . โ”œโ”€โ”€ include โ”‚ย ย  โ”œโ”€โ”€ bar.h โ”‚ย ย  โ””โ”€โ”€ foo.h โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ foo.cc โ””โ”€โ”€ main.cc ์ด ๊ฒฝ์šฐ Makefile ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ INCLUDE = -Iinclude/ # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) DEPS = $(SRCS:.cc=.d) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ์‚ฌ์‹ค ๊ธฐ์กด๊ณผ ๋ณ„ ์ฐจ์ด ์—†๊ณ  ๊ทธ๋ƒฅ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์— -Iinclude/ ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ include ๋Š” ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํŒ์œผ๋กœ ๊ทธ๋ƒฅ make ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด 1 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰๋˜์–ด์„œ ์†๋„๊ฐ€ ๊ฝค๋‚˜ ๋А๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ GCC ๋‚˜ ์ปค๋„์„ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ ํ•œ ๋‘ ์‹œ๊ฐ„์€ ๊ทธ๋ƒฅ ๊ฑธ๋ฆฌ์ง€์š”. ๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ( ์•„๋งˆ ๋Œ€๋ถ€๋ถ„ ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ) make ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ธ์ž๋กœ -j ๋’ค์— ๋ช‡ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์ˆซ์ž๋ฅผ ์ ์–ด์„œ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ $ make -j8 ์„ ํ•˜๋ฉด make ๊ฐ€ 8 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์— ๋‚˜๋‰˜์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ make ์†๋„๊ฐ€ ์›”๋“ฑํ•˜๊ฒŒ ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ ์ฝ”์–ด ๊ฐœ์ˆ˜ + 1 ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ฝ”์–ด ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋ฆฌ๋ˆ…์Šค ํ„ฐ๋ฏธ๋„์˜ ๊ฒฝ์šฐ $ make -j$(nproc) ์œผ๋กœ ํ•˜๋ฉด $(nproc) ์ด ์•Œ์•„์„œ ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ˜„์žฌ ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ขŒ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ถ๊ธˆํ•œ ๊ฒƒ์ด๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ผญ ๋Œ“๊ธ€ ์„ ๋‚จ๊ฒจ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ๊ฐ•์ขŒ์— ๊ด€๋ จ๋œ ๊ฒƒ์ด๋ผ๋ฉด ์–ด๋– ํ•œ ๊ฒƒ๋„ ์งˆ๋ฌธํ•ด ์ฃผ์…”๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณผ ๋ฌธ์ œ๋„ ์ • ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”. ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์‹  ๊ฐ•์ขŒ๋Š” <์”น์–ด๋จน๋Š” C++ - <19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)>> ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์งค ์ˆ˜์ค€๊นŒ์ง€ ๊ฐ•์ขŒ๋ฅผ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ๊ฐ•์ขŒ๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ง์•„์ฃผ์„ธ์š”
Markdown
[๋ชจ๋‘์˜ ์ฝ”๋“œ](https://modoocode.com/) ๋กœ๊ทธ์ธ - [๋ชจ๋“  ๊ธ€](https://modoocode.com/category) - [C ์–ธ์–ด](https://modoocode.com/category/C) - [C ๋ ˆํผ๋Ÿฐ์Šค](https://modoocode.com/category/C%20Reference) - [stdio.h](https://modoocode.com/category/C%20Reference/stdio.h) - [stdlib.h](https://modoocode.com/category/C%20Reference/stdlib.h) - [string.h](https://modoocode.com/category/C%20Reference/string.h) - [time.h](https://modoocode.com/category/C%20Reference/time.h) - [C++](https://modoocode.com/category/C++) - [C++ ๋ ˆํผ๋Ÿฐ์Šค](https://modoocode.com/category/C++%20Reference) - [Containers](https://modoocode.com/category/C++%20Reference/Containers) - [algorithm](https://modoocode.com/category/C++%20Reference/algorithm) - [array](https://modoocode.com/category/C++%20Reference/array) - [iostream](https://modoocode.com/category/C++%20Reference/iostream) - [string](https://modoocode.com/category/C++%20Reference/string) - [string\_view](https://modoocode.com/category/C++%20Reference/string_view) - [utility](https://modoocode.com/category/C++%20Reference/utility) - [Rust](https://modoocode.com/category/Rust) - [X86-64 ๋ช…๋ น์–ด ๋ ˆํผ๋Ÿฐ์Šค](https://modoocode.com/category/X86-64%20%EB%AA%85%EB%A0%B9%EC%96%B4%20%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4) - [์•Œ๊ณ ๋ฆฌ์ฆ˜](https://modoocode.com/category/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98) - [์ž๋ฃŒ ๊ตฌ์กฐ](https://modoocode.com/category/%EC%9E%90%EB%A3%8C%20%EA%B5%AC%EC%A1%B0) - [์žก๋‹ด](https://modoocode.com/category/%EC%9E%A1%EB%8B%B4) - [ํ”„๋กœ๊ทธ๋ž˜๋ฐ](https://modoocode.com/category/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) ยง ์นดํ…Œ๊ณ ๋ฆฌ - [C++](https://modoocode.com/category/C++) [โ‹ฎ(๋”๋ณด๊ธฐ)](https://modoocode.com/category/C++) - [17 - 4. C++ ํŒŒ์ผ ์‹œ์Šคํ…œ() ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ](https://modoocode.com/306) - [17 - 5. C++ 17 ์˜ std::optional, variant, tuple ์‚ดํŽด๋ณด๊ธฐ](https://modoocode.com/309) - [์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ C++ ๊ฐ•์ขŒ - ์”น์–ด๋จน๋Š” C++ (์™„๊ฒฐ)](https://modoocode.com/310) - [19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)](https://modoocode.com/311) - [19 - 2. C++ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ CMake ์‚ฌ์šฉ๋ฒ•](https://modoocode.com/332) - [20 - 1. ์ฝ”๋“œ ๋ถ€ํ„ฐ ์‹คํ–‰ ํŒŒ์ผ ๊นŒ์ง€](https://modoocode.com/319) - [20 - 2.์ฝ”๋“œ ๋ถ€ํ„ฐ ์‹คํ–‰ ํŒŒ์ผ ๊นŒ์ง€ - ์ปดํŒŒ์ผ (Compile)](https://modoocode.com/320) [(๋”๋ณด๊ธฐ)โ‹ฎ](https://modoocode.com/category/C++) ๋ชฉ์ฐจ 1. ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์™„์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ 1. ์ปดํŒŒ์ผ (Compile) 2. ๋งํ‚น (Linking) 2. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ make ๋ฅผ ์“ฐ๋Š”์ง€? 3. make 1. target 2. ์‹คํ–‰ํ•  ๋ช…๋ น์–ด(recipes) 3. ํ•„์š” ์กฐ๊ฑด๋“ค(prerequisites) 4. ๋ณ€์ˆ˜ 1. ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• 5. PHONY 6. ํŒจํ„ด ์‚ฌ์šฉํ•˜๊ธฐ 7. ์ž๋™์œผ๋กœ prerequisite ๋งŒ๋“ค๊ธฐ 8. ์ตœ์ข… ์ •๋ฆฌ 1. ํ—ค๋” ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ ๋ฝ‘๋Š” ๊ฒฝ์šฐ 9. ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด์„œ Make ์†๋„๋ฅผ ์˜ฌ๋ฆฌ์ž ํ›„์› ๊ด‘๊ณ  ## [๋ชจ๋‘์˜ ์ฝ”๋“œ](https://modoocode.com/ "Home") ์”น์–ด๋จน๋Š” C++ - \<19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)\> ์ž‘์„ฑ์ผ : 2020-06-10 ์ด ๊ธ€์€ 105837 ๋ฒˆ ์ฝํ˜”์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์—์„œ๋Š” - make ์˜ ์ž‘๋™ ์ดํ•ด - Makefile ๋ฌธ๋ฒ• ์ดํ•ด - ๋งŒ๋Šฅ Makefile ๋งŒ๋“ค๊ธฐ ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ![](https://modoocode.com/img/ChewingCpplogo.webp) ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ๊ฐ•์ขŒ ๋ถ€ํ„ฐ๋Š” ์”น์–ด๋จน๋Š” C++ ์‹œ๋ฆฌ์ฆˆ์˜ ๋ถ€๋ก ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ C++ ์–ธ์–ด ์ž์ฒด์™€๋Š” ์ง์ ‘ ๊ด€๋ จ์€ ์—†์ง€๋งŒ ์‹ค์ œ๋กœ C++ ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ง€์‹๋“ค๊ณผ ํˆด๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฒซ ๋ฒˆ์งธ ํƒ€์ž๋กœ Makefile ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์‹  ๋ถ„๋“ค์€ ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ์—์„œ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ์ปดํŒŒ์ผ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•Œ์•„์„œ ์ปดํŒŒ์ผ ๋˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์‰˜ ์ƒ์—์„œ ์ปดํŒŒ์ผ์„ ํ•˜๋ ค๋ฉด ์–ด๋–ค ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ณ , ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ง€ ์ง์ ‘ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ํŒŒ์ผ๋“ค์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ๋งค๋ฒˆ ๊ทธ๋ ‡๊ฒŒ ์นœ๋‹ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ํ”„๋กœ๊ทธ๋žจ์€ Makefile ๋ผ๋Š” ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ฃผ์–ด์ง„ ๋ฐฉ์‹๋Œ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ๋“ค์„ ๋ช…๋ น์–ด ํ•œ ๋ฒˆ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” make ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ Makefile ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ### ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์™„์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ๋จผ์ € make ๊ฐ€ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์™„์„ฑ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. #### ์ปดํŒŒ์ผ (Compile) ๊ฐ€์žฅ ๋จผ์ € ์—ฌ๋Ÿฌ๋ถ„์˜ ๋จธ๋ฆฌ ์†์œผ๋กœ ๋– ์˜ค๋ฅด๋Š” ๊ณผ์ •์€ ๋ฐ”๋กœ ์ปดํŒŒ์ผ(Compile) ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ์ด๋ผ๋Š” ๊ณผ์ •์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด `foo.h` ์— ์ •์˜๋œ `foo` ํ•จ์ˆ˜์™€ `bar.h` ์— ์ •์˜๋œ `bar` ํ•จ์ˆ˜๋ฅผ `main` ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. - foo.h ``` int foo(); ``` - foo.cc ``` #include <iostream> #include "foo.h" int foo() { std::cout << "Foo!" << std::endl; return 0; } ``` - bar.h ``` int bar(); ``` - bar.cc ``` #include <iostream> #include "bar.h" int bar() { std::cout << "Bar!" << std::endl; return 0; } ``` - main.cc ``` #include "bar.h" #include "foo.h" int main() { foo(); bar(); } ``` ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ clang ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด g++ ์ž๋ฆฌ์— clang ์„ ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. clang ๊ณผ g++ ์€ ์‚ฌ์šฉ ๋ช…๋ น์–ด๊ฐ€ ๊ฑฐ์˜ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ``` $ g++ -c main.cc ``` `g++` ์— ์ „๋‹ฌํ•˜๋Š” `-c` ๋ช…๋ น์–ด๋Š” ์ธ์ž ๋‹ค์Œ์— ์ฃผ์–ด์ง€๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•ด์„œ ๋ชฉ์  ํŒŒ์ผ(object file) ์„ ์ƒ์„ฑํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜์˜€๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด `main.o` ๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` $ ls main.o main.o ``` ์ด `main.o` ๋Š” `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main.o` ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด ``` $ objdump -S main.o main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 push %rbp 5: 48 89 e5 mov %rsp,%rbp 8: e8 00 00 00 00 callq d <main+0xd> d: e8 00 00 00 00 callq 12 <main+0x12> 12: b8 00 00 00 00 mov $0x0,%eax 17: 5d pop %rbp 18: c3 retq ``` ์™€ ๊ฐ™์ด `main.cc` ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋“ค์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋ญ”์ง€ ์ดํ•ด๊ฐ€ ์ „ํ˜€ ์•ˆ๊ฐ€๋„ Make ๊ฐ€ ๋ญ”์ง€ ์ดํ•ดํ•˜๋Š”๋ฐ ์ „ํ˜€ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ '๋ชฉ์ ํŒŒ์ผ์—๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋“ค์–ด ์žˆ๊ตฌ๋‚˜' ์ •๋„๋กœ ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main.o` ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์Šฌ์ฉ ๋ณด๋ฉด `foo` ๋‚˜ `bar` ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ํ•˜๋‚˜๋„ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `main.o` ์ž์ฒด๋กœ๋Š” ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด `main.o` ์—๋Š” `foo` ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ผ\! ๋ผ๋Š” ๋‚ด์šฉ๋งŒ ์žˆ์ง€, `foo` ๋Š” ์–ด๋””์— ์žˆ๊ณ  ์ด๋Ÿฌ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ˆˆ์ฐ๋ฏธ๊ฐ€ ์ข‹์œผ์‹  ๋ถ„๋“ค์€ ์œ„ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ callq ์ž๋ฆฌ์— ํ•จ์ˆ˜ ์ด๋ฆ„ ๋Œ€์‹ ์— ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” `foo` ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” `foo.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ `foo.o` ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `bar` ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” `bar.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“  `bar.o` ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ฐ๊ฐ์˜ `main.o, foo.o, bar.o` ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ฒ ์ฃ . ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋งํ‚น(Linking) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ![](https://modoocode.com/img/cpp/a.1.1.png) #### ๋งํ‚น (Linking) ๋งํ‚น์ด ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋งํฌ ํ•˜๋Š” ์ž‘์—… ์ธ ์ด์œ ๋Š” ์‹ค์ œ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ํฉ์–ด์ ธ ์žˆ๋˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋“ค์„ ํ•œ ๋ฐ ๋ฌถ์–ด์„œ ๋งํฌํ•ด์ฃผ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ๊ณผ์ •์—์„œ `main` ํ•จ์ˆ˜ ์•ˆ์— `foo` ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ์œ„์น˜๋ฅผ ์ฐพ๊ณ  ์ œ๋Œ€๋กœ ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋งํ‚น์— ๊ด€ํ•ด์„œ ์ด์•ผ๊ธฐ๋งŒ ํ•ด๋„ ํ•œ์ฐธ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋‹จ ์ด ๊ธ€์˜ ๋ชฉํ‘œ๋Š” ๋นŒ๋“œ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ค„์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋งํ‚น ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ชฉ์ ํŒŒ์ผ์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ``` $ g++ main.o foo.o bar.o -o main ``` ์—ฌ๊ธฐ์„œ `-o` ์˜ต์…˜์€ ๊ทธ ๋’ค์— ๋งํ‚น ํ›„์— ์ƒ์„ฑํ•  ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ `main` ์ด๋ผ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๊ณ  ๋งŒ์•ฝ์— ์ด๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๋ƒฅ `./a.out` ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋””ํดํŠธ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main` ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ ``` Foo! Bar! ``` ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. ### ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ make ๋ฅผ ์“ฐ๋Š”์ง€? ์ผ๋‹จ ์œ„์™€ ๊ฐ™์ด `main` ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋ ฅํ•œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ญ‰ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด; ``` $ g++ -c main.cc $ g++ -c foo.cc $ g++ -c bar.cc $ g++ main.o foo.o bar.o -o main ``` ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด ๋งค ๋ฒˆ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค๋งŒ, ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์ณ์•ผํ•  ๋ช…๋ น์–ด๊ฐ€ ๋” ๋งŽ์•„์ง€๊ฒŒ ๋˜์„œ ๋ณต์žกํ•˜๊ฒ ์ง€์š” (ํŠนํžˆ ํŒŒ์ผ๋“ค์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š”๋‹ค๋ฉด ๋ง์ด์ฃ .) ๋ฌผ๋ก  ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์กฐ๊ธˆ ์•„์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด > ๊ทธ๋ƒฅ ์œ„ ๋ช…๋ น์–ด๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋ผ๊ณ  ๋ฌผ์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค๋ฉด ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์—ฌ๋Ÿฌ๋ถ„์ด `main.cc` ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ๋Š” ``` $ g++ -c main.cc $ g++ main.o foo.o bar.o -o main ``` ๋”ฑ ์ด ๋‘ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด `main` ํŒŒ์ผ์„ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด์„œ `foo` ๋‚˜ `bar` ์˜ ์ปดํŒŒ์ผ ๋œ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•˜์ง€๋งŒ ์œ„ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๊ฒŒ ๋œ๋‹ค๋ฉด ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”๋„ ์ „์ฒด ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋งค์šฐ ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ make ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๋ช…๋ น๋งŒ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ž ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  make ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ make ๋ฅผ ์œ„ํ•œ Makefile ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ### make make ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์ฃผ์–ด์ง„ ์‰˜ ๋ช…๋ น์–ด๋“ค์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์–ด๋– ํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋‹ด์€ ํŒŒ์ผ์„ Makefile ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, make ๋ฅผ ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” Makefile ์„ ์ฐพ์•„์„œ ์ฝ์–ด๋“ค์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Makefile ์—๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ฑด์„ ๊ธฐ์ˆ ํ• ๊นŒ์š”? ``` target โ€ฆ : prerequisites โ€ฆ (ํƒญ)recipe โ€ฆ โ€ฆ ``` Makefile ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด 3 ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. #### target make ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ `make abc` ๊ณผ ๊ฐ™์ด ์–ด๋– ํ•œ ๊ฒƒ์„ make ํ•  ์ง€ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ํƒ€๊ฒŸ(target) ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์ผ `make abc` ๋ฅผ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํƒ€๊ฒŸ ์ค‘์— `abc` ๋ฅผ ์ฐพ์•„์„œ ์ด์— ๋Œ€์‘๋˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. #### ์‹คํ–‰ํ•  ๋ช…๋ น์–ด(recipes) ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋“ค์˜ ๋‚˜์—ด์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์€ recipe ์ž๋ฆฌ์— ๋ช…๋ น์–ด๋ฅผ ์“ธ ๋•Œ ๋ฐ˜๋“œ์‹œ ํƒญ ํ•œ ๋ฒˆ์œผ๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•ด์ค˜์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์š”์ฆ˜์˜ ํŽธ์ง‘๊ธฐ์˜ ๊ฒฝ์šฐ (์˜ˆ๋ฅผ ๋“ค์–ด VSCode), ์ž๋™์œผ๋กœ ํƒญ์„ ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์„ ํ…๋ฐ make ๊ฐ€ Makefile ์„ ์ œ๋Œ€๋กœ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํƒญ์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค\! #### ํ•„์š” ์กฐ๊ฑด๋“ค(prerequisites) ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‚ฌ์šฉ๋  ํŒŒ์ผ๋“ค์˜ ๋ชฉ๋ก ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ์˜์กด ํŒŒ์ผ(dependency) ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด๋“œ๋ ค์•ผ ํ•  ํŒŒ์ผ๋“ค์„ ์จ๋†“์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ ์ฃผ์–ด์ง„ ํŒŒ์ผ๋“ค์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ํƒ€๊ฒŸ์ด ๋” ๋‚˜์ค‘์— ์ˆ˜์ •๋˜์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ์ด์ „์— ํƒ€๊ฒŸ์ด ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํƒ€๊ฒŸ์ด `main.o` ์ด๊ณ , ๋ช…๋ น์–ด๊ฐ€ `g++ -c main.cc` ๋ผ๋ฉด, ํ•„์š” ์กฐ๊ฑด๋“ค์€ `main.cc`, `foo.h`, `bar.h` ๊ฐ€ ๋˜๊ฒ ์ฃ . ์™œ๋ƒํ•˜๋ฉด ์ด๋“ค ํŒŒ์ผ๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐ”๋€๋‹ค๋ฉด `main` ์„ ์ƒˆ๋กœ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ฐ˜๋ฉด์— `main.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด `main.cc`, `foo.h`, `bar.h` ๋“ค์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋ผ๋ฉด, ๊ตณ์ด `main.o` ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Makefile ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` foo.o : foo.h foo.cc g++ -c foo.cc bar.o : bar.h bar.cc g++ -c bar.cc main.o : main.cc foo.h bar.h g++ -c main.cc main : foo.o bar.o main.o g++ foo.o bar.o main.o -o main ``` ์ฃผ์˜ ์‚ฌํ•ญ ์œ„ Makefile ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์•„๋งˆ ์‹คํ–‰์ด ์•ˆ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒญ์ด ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๋€Œ์–ด์„œ ๊ทธ๋Ÿฐ๋ฐ์š”, ์ œ๋Œ€๋กœ Makefile ์„ ๋งŒ๋“œ์‹œ๊ธฐ ์œ„ํ•ด์„œ๋Š” g++ ์•ž์— ์˜ค๋Š” ์ŠคํŽ˜์ด์Šค ๋‘ ๋ฒˆ์„ ํƒญ์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์ €์žฅํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์ธ `main` ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— `make main` ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ``` $ make main g++ -c foo.cc g++ -c bar.cc g++ -c main.cc g++ foo.o bar.o main.o -o main ``` ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ `main` ์ด ์ž˜ ๋งŒ๋“ค์–ด์ง์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ํ•œ ๋ฒˆ๋„ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ `make main` ์„ ์‹คํ–‰ํ•˜๋ฉด make ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 1. `make main` ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด `main` ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. 2. ์˜ค. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด `foo.o bar.o main.o` ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. 3. `foo.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `foo.cc` ๋„ค? ์•„์ง `foo.o` ๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฒ ๊ตฐ\! 4. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `bar.o, main.o` ๋„ ์ปดํŒŒ์ผ 5. ์ž ์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ `g++ foo.o bar.o main.o -o main` ๋ฅผ ์‹คํ–‰ํ•ด์•ผ์ง€ ๋งŒ์•ฝ์— ์—ฌ๋Ÿฌ๋ถ„์ด `make main` ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ์ƒํƒœ์—์„œ `foo.cc` ๋งŒ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์žฌ์ปดํŒŒ์ผ ๋ฉ๋‹ˆ๋‹ค. 1. `make main` ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด `main` ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. 2. ์˜ค. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด `foo.o bar.o main.o` ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. 3. `foo.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `foo.cc` ๋„ค? ๊ทธ๋Ÿฐ๋ฐ `foo.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„ ๋ณด๋‹ค `foo.cc` ์˜ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋” ๋‚˜์ค‘์ด๊ตฐ! ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด 4. `bar.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `bar.cc` ์ธ๋ฐ, `bar.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด `bar.cc` ์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋„ค. ๊ตณ์ด ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒ ์–ด 5. `main.o` ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์‹œ ์•ˆ๋ฐ”๊ฟ”๋„ ๋˜๊ฒ ๊ตฐ\! 6. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค ์ค‘ `foo.o` ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ ๋‚ด ๋ช…๋ น์–ด๋“ค๋„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด. ๋”ฐ๋ผ์„œ ๋”ฑ ํ•„์š”ํ•œ `g++ -c foo.cc` ์™€ `g++ foo.o bar.o main.o -o main` ๋งŒ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ### ๋ณ€์ˆ˜ ์žฌ๋ฏธ์žˆ๊ฒŒ๋„ Makefile ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` CC = g++ ``` ์œ„ ๊ฒฝ์šฐ `CC` ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๋Š”๋ฐ, ์ด์ œ Makefile ๋‚ด์—์„œ `CC` ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฌธ์ž์—ด์ธ `g++` ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `$(CC)` ์™€ ๊ฐ™์ด `$()` ์•ˆ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` CC = g++ foo.o : foo.h foo.cc $(CC) -c foo.cc ``` ๋Š” ์‚ฌ์‹ค ``` CC = g++ foo.o : foo.h foo.cc g++ -c foo.cc ``` ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ช…๋ น์ด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. #### ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ฃผ์˜ ์‚ฌํ•ญ ์ด ๋ถ€๋ถ„์€ TMI ์ด๋ฏ€๋กœ ๋ฐ”์˜์‹  ๋ถ„๋“ค์€ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค. Makefile ์ƒ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ = ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ `:=` ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ์‚ด์ง ๋‹ค๋ฆ…๋‹ˆ๋‹ค. \= ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€์„ ๋•Œ, ์ •์˜์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜๊ธฐ ๋  ๋•Œ ๊นŒ์ง€ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ •ํ•ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` B = $(A) C = $(B) A = a ``` `C` ์˜ ๊ฒฝ์šฐ `B` ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ , `B` ์˜ ๊ฒฝ์šฐ `A` ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ `B =` ๋ฅผ ์‹คํ–‰ํ•œ ์‹œ์ ์—์„œ `A` ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ `B` ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ `=`๋กœ ์ •์˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— `A` ๊ฐ€ ์‹ค์ œ๋กœ ์ •์˜๋  ๋•Œ ๊นŒ์ง€ `B` ์™€ `C` ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰์— `A = a` ๋ฅผ ํ†ตํ•ด `A` ๊ฐ€ `a` ๋กœ ๋Œ€์‘๋˜์–ด์•ผ, `C` ๊ฐ€ `a` ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ``` B := $(A) A = a ``` ๋ฐ˜๋ฉด์— `:=` ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹œ์ ์—์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ `B` ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๊ฒ ์ง€์š”. ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ๋Š” `=` ๋‚˜ `:=` ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ - ๋งŒ์ผ ๋ณ€์ˆ˜๋“ค์˜ ์ •์˜ ์ˆœ์„œ์— ํฌ๊ฒŒ ๊ตฌ์• ๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด `=` ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค. - `A =` ์™€ ๊ฐ™์ด ์ž๊ธฐ ์ž์‹ ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด `:=` ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ์ง€ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ ๋ช…์‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋“ค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Makefile ์„ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main ``` make ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ``` $ make main g++ -Wall -O2 -c foo.cc g++ -Wall -O2 -c bar.cc g++ -Wall -O2 -c main.cc g++ -Wall -O2 foo.o bar.o main.o -o main ``` ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. `CC` ์™€ `CXXFLAGS` ๋Š” Makefile ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ๋ณดํ†ต `CC` ์—๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ด๋ฆ„์„, `CXXFLAGS` ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ฃผ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์  ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด๋Š” C++ ์˜ ๊ฒฝ์šฐ ์ด๊ณ , C ์˜ ๊ฒฝ์šฐ CFLAGS ์— ์˜ต์…˜์„ ์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ `g++` ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ต์…˜์œผ๋กœ๋Š” `Wall` (๋ชจ๋“  ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ) ๊ณผ `O2` (์ตœ์ ํ™” ๋ ˆ๋ฒจ 2) ๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค -Wall ์€ ์ด๋ฆ„๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ### PHONY Makefile ์— ํ”ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋นŒ๋“œ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค (.o ํŒŒ์ผ๋“ค)์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ``` clean: rm -f $(OBJS) main ``` ์‹ค์ œ๋กœ `make clean` ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ชฉ์  ํŒŒ์ผ๊ณผ `main` ์„ ์ง€์›Œ๋ฒ„๋ฆผ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ์— ์‹ค์ œ๋กœ `clean` ์ด๋ผ๋Š” ํŒŒ์ผ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ `make clean` ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, make ๋Š” clean ์˜ ํ•„์š” ํŒŒ์ผ๋“ค์ด ์—†๋Š”๋ฐ, clean ํŒŒ์ผ์ด ์žˆ์œผ๋‹ˆ๊นŒ clean ํŒŒ์ผ์€ ํ•ญ์ƒ ์ตœ์‹ ์ด๋„ค? recipe ๋ฅผ ์‹คํ–‰ ์•ˆํ•ด๋„ ๋˜๊ฒ ๋„ค\! ํ•˜๋ฉด์„œ ๊ทธ๋ƒฅ `make clean` ๋ช…๋ น์„ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ``` $ ls clean clean $ make clean make: 'clean' is up to date. ``` ์‹ค์ œ๋กœ ๋””๋ ‰ํ† ๋ฆฌ์— `clean` ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋†“๊ณ  ์‹คํ–‰ํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ `clean` ์€ ์ตœ์‹ ์ด๋ผ๋ฉฐ `recipe` ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” `clean` ์„ `PHONY` ๋ผ๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Phony ๋Š” '๊ฐ€์งœ์˜, ํ—ˆ์œ„์˜' ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ง€์š”. ``` .PHONY: clean clean: rm -f $(OBJS) main ``` ์ด์ œ `make clean` ์„ ํ•˜๊ฒŒ ๋˜๋ฉด `clean` ํŒŒ์ผ์˜ ์œ ๋ฌด์™€ ์ƒ๊ด€ ์—†์ด ์–ธ์ œ๋‚˜ ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ### ํŒจํ„ด ์‚ฌ์šฉํ•˜๊ธฐ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์ด 3 ๊ฐœ ๋ฐ–์— ์—†์–ด์„œ ๋‹คํ–‰์ด์˜€์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ˆ˜์‹ญ~ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ฐ๊ฐ์˜ ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ ๋นŒ๋“œ ๋ฐฉ์‹์„ ๋ช…์‹œํ•ด์ค€๋‹ค๋ฉด Makefile ์˜ ํฌ๊ธฐ๊ฐ€ ์—„์ฒญ ์ปค์ง€๊ฒ ์ง€์š”. ๋‹คํ–‰์ด๋„ Makefile ์—์„œ๋Š” ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด์„œ ํŠน์ • ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ `recipe` ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ``` foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc ``` ์ผ๋‹จ ๋จผ์ € ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด ์œ„ ๋‘ ๋ช…๋ น๋“ค์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ``` ๋จผ์ € `%.o` ๋Š” ์™€์ผ๋“œ์นด๋“œ๋กœ ๋”ฐ์ง€๋ฉด ๋งˆ์น˜ `*.o` ์™€ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, `.o` ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„๋“ค์ด ํƒ€๊ฒŸ์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ง€์š”. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `foo.o` ๊ฐ€ ํƒ€๊ฒŸ์ด๋ผ๋ฉด % ์—๋Š” `foo` ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ  `bar.o` ์˜ ๊ฒฝ์šฐ % ์—๋Š” `bar` ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด `foo.o` ๊ฐ€ ํƒ€๊ฒŸ์ผ ๊ฒฝ์šฐ ``` foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c $< ``` ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ํŒจํ„ด์€ ํƒ€๊ฒŸ๊ณผ `prerequisite` ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `recipe` ๋ถ€๋ถ„์—์„œ๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— `foo.cc` ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Makefile ์˜ ์ž๋™ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `$<` ์˜ ๊ฒฝ์šฐ `prerequisite` ์—์„œ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์˜ ์ด๋ฆ„์— ๋Œ€์‘๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ `foo.cc` ๊ฐ€ ๋˜๊ฒ ์ง€์š”. ๋”ฐ๋ผ์„œ ์œ„ ๋ช…๋ น์–ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ``` foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c foo.cc ``` ๊ฐ€ ๋˜์–ด์„œ ์ด์ „์˜ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. Makefile ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๋ณ€์ˆ˜๋กœ๋Š” ๊ทธ ์™ธ์—๋„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด `$@`, `$<`, `$^` ๋“ฑ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ![](https://modoocode.com/img/cpp/a.1.2.png) - `$@` : ํƒ€๊ฒŸ ์ด๋ฆ„์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$<` : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$^` : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก ์ „์ฒด์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$?` : ํƒ€๊ฒŸ ๋ณด๋‹ค ์ตœ์‹ ์ธ ์˜์กด ํŒŒ์ผ๋“ค์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$+` : `$^` ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ค‘๋ณต๋œ ํŒŒ์ผ ์ด๋ฆ„๋“ค ๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์œ„ ํŒจํ„ด์œผ๋กœ๋Š” ``` main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc ``` ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— `main.h` ๊ฐ€ ์—†๊ณ  `foo.h` ์™€ `bar.h` ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‚ฌ์‹ค ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ๋Š” ํ•ด๋‹น ์†Œ์Šค ํŒŒ์ผ์ด ์–ด๋– ํ•œ ํ—ค๋”ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ƒ์— ๊ฒฐ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `main.cc` ๊ฐ€ `foo.h` ์™€ `bar.h` ๋ฅผ `include` ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `main.o` ์˜ `prerequisite` ๋กœ `main.cc` ์™ธ์—๋„ `foo.h` ์™€ `bar.h` ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ์ผ์ผํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์†Œ์Šค ํŒŒ์ผ์— ํ—ค๋” ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค Makefile ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†๋Š” ๋…ธ๋ฆ‡์ด๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ๋‹คํ–‰์ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€์„ ๋ฐ›์•„์„œ ์˜์กดํŒŒ์ผ ๋ชฉ๋ก ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### ์ž๋™์œผ๋กœ prerequisite ๋งŒ๋“ค๊ธฐ ์ปดํŒŒ์ผ ์‹œ์— `-MD` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ์ปดํŒŒ์ผ ํ•ด๋ด…์‹œ๋‹ค. ``` $ g++ -c -MD main.cc ``` ๊ทธ๋ ‡๋‹ค๋ฉด `main.d` ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ฉด; ``` $ cat main.d main.o: main.cc /usr/include/stdc-predef.h foo.h bar.h ``` ๋†€๋ž๊ฒŒ๋„ ๋งˆ์น˜ Makefile ์˜ `target: prerequisite` ์ธ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— `-MD` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, ๋ชฉ์  ํŒŒ์ผ ๋ง๊ณ ๋„ ์ปดํŒŒ์ผ ํ•œ ์†Œ์ŠคํŒŒ์ผ์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š” ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์„ ๋‹ด์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ `main.cc, foo.h, bar.h` ๊นŒ์ง€๋Š” ์ดํ•ด๊ฐ€ ๊ฐ€๋Š”๋ฐ ์™œ ์ƒ๋šฑ๋งž์€ `/usr/include/stdc-predef.h` ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํŒŒ์ผ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ `main.d` ๋ฅผ ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ์˜ Makefile ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋ƒ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main include main.d ``` ์œ„ `include main.d` ๋Š” `main.d` ๋ผ๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ Makefile ์— ํฌํ•จํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„์‹ธ๋ฆฌ ``` %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ``` ๋ถ€๋ถ„์„ ์•„์˜ˆ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ `.d` ํŒŒ์ผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”? ๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค\! ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main -include $(OBJS:.o=.d) ``` `$(OBJS:.o=.d)` ๋ถ€๋ถ„์€ `OBJS` ์—์„œ `.o` ๋กœ ๋๋‚˜๋Š” ๋ถ€๋ถ„์„ `.d` ๋กœ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ถ€๋ถ„์€ `-include foo.d bar.d main.d` ๊ฐ€ ๋˜๊ฒ ์ฃ . ์ฐธ๊ณ ๋กœ `foo.d` ๋‚˜ `bar.d` ๊ฐ€ `include` ๋  ๋•Œ ์ด๋ฏธ ์žˆ๋Š” `%.o: %.cc` ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ฐ™์€ ํƒ€๊ฒŸ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก๋“ค์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค๋ฉด ์ด๋Š” make ์— ์˜ํ•ด ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ง๋ถ™์—ฌ `include` ์—์„œ `-include` ๋กœ ๋ฐ”๊พธ์—ˆ๋Š”๋ฐ, `-include` ์˜ ๊ฒฝ์šฐ ํฌํ•จํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ make ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์— make ๋ฅผ ํ•  ๋•Œ์—๋Š” `.d` ํŒŒ์ผ๋“ค์ด ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— `include` ๊ฐ€ ์•„๋ฌด๋Ÿฐ `.d` ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํฌ๊ฒŒ ๋ฌธ์ œ ์—†๋Š” ๊ฒƒ์ด ์–ด์ฐจํ”ผ `.o` ํŒŒ์ผ๋“ค๋„ make ๊ฐ€ `%.o: %.cc` ๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์— make ๋ฅผ ํ•˜๊ฒŒ ๋  ๋•Œ์—๋Š” ์ œ๋Œ€๋กœ `.d` ํŒŒ์ผ๋“ค์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ### ์ตœ์ข… ์ •๋ฆฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ``` $ tree . โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ bar.h โ”œโ”€โ”€ foo.cc โ”œโ”€โ”€ foo.h โ””โ”€โ”€ main.cc ``` ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์€ `src` ์— ๋“ค์–ด๊ฐ€๊ณ  ๋นŒ๋“œ ํŒŒ์ผ๋“ค์€ `obj` ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ข…์ข… ํ—ค๋” ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ `include` ์— ๋นผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ €๋Š” ๊ตณ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณ„๋กœ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ตณ์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์„ ์ด์œ ๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) ์•„๋ฌดํŠผ ์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋Šฅ Makefile ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ๋ณต์‚ฌํ•œ ํ›„์— `$(CC)` ์™€ `rm` ์•ž์— ์ŠคํŽ˜์ด์Šค ๋‘ ๊ฐœ๋ฅผ ๊ผญ TAB ์œผ๋กœ ์น˜ํ™˜ํ•ด์ฃผ์„ธ์š”! ์•ˆ ๊ทธ๋Ÿฌ๋ฉด make ๊ฐ€ ์ฝ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ``` CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ``` ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„๋งŒ ๊ฐ„๋‹จํžˆ ๋ถ€์—ฐ ์„ค๋ช…์„ ํ•˜์ž๋ฉด ``` # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) ``` ๋จผ์ € `SRC_DIR` ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ `SRCS` ๋กœ ์ฝ์–ด๋“ค์ด๋ ค ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. `wildcard` ๋Š” ํ•จ์ˆ˜๋กœ ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ํŒŒ์ผ๋“ค์„ ๋ฝ‘์•„๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `foo.cc, bar.cc, main.cc` ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ `$(wildcard $(SRC_DIR)/*.cc)` ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” `./src/foo.cc ./src/bar.cc ./src/main.cc` ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” `foo.cc bar.cc main.cc` ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด `notdir` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `notdir` ์€ ์•ž์— ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์ถ”์ถœํ•ด์ค๋‹ˆ๋‹ค. ``` OBJS = $(SRCS:.cc=.o) ``` ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์—์„œ `OBJS` ๋Š” `foo.o bar.o main.o` ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด `OBJS` ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ `.o` ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ด๋“ค ํŒŒ์ผ ์ด๋ฆ„ ์•ž์— `$(OBJ_DIR)/` ์„ ๋ถ™์—ฌ์ค˜์•ผ ๊ฒ ์ง€์š”. ์ด๋ฅผ ์œ„ํ•ด์„  `patsubst` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ``` # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) ``` `patsubst` ํ•จ์ˆ˜๋Š” `$(patsubst ํŒจํ„ด,์น˜ํ™˜ ํ›„ ํ˜•ํƒœ,๋ณ€์ˆ˜)` ์˜ ๊ฐ™์€ ๊ผด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ `$(OBJS)` ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  `%.o` ํŒจํ„ด์„ `$(OBJ_DIR)/%.o` ๋กœ ์น˜ํ™˜ํ•ด๋ผ ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ๋•๋ถ„์— `OBJECTS` ์—๋Š” ์ด์ œ .`/obj/foo.o ./obj/bar.o ./obj/main.o` ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค์— ๋‚ด์šฉ์€ ์•ž์˜ ๊ธ€์„ ์ž˜ ๋”ฐ๋ผ ์˜ค์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์ž˜ ์ดํ•ด ํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค. #### ํ—ค๋” ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ ๋ฝ‘๋Š” ๊ฒฝ์šฐ ๋งŒ์•ฝ์— ํ—ค๋” ํŒŒ์ผ๋“ค๋งŒ ๋”ฐ๋กœ ๋ฝ‘๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒ ์ฃ . ``` $ tree . โ”œโ”€โ”€ include โ”‚ย ย  โ”œโ”€โ”€ bar.h โ”‚ย ย  โ””โ”€โ”€ foo.h โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ foo.cc โ””โ”€โ”€ main.cc ``` ์ด ๊ฒฝ์šฐ Makefile ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ``` CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ INCLUDE = -Iinclude/ # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) DEPS = $(SRCS:.cc=.d) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ``` ์‚ฌ์‹ค ๊ธฐ์กด๊ณผ ๋ณ„ ์ฐจ์ด ์—†๊ณ  ๊ทธ๋ƒฅ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์— `-Iinclude/` ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ `include` ๋Š” ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ ์ž…๋‹ˆ๋‹ค. ### ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด์„œ Make ์†๋„๋ฅผ ์˜ฌ๋ฆฌ์ž ํ•œ ๊ฐ€์ง€ ํŒ์œผ๋กœ ๊ทธ๋ƒฅ make ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด 1 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰๋˜์–ด์„œ ์†๋„๊ฐ€ ๊ฝค๋‚˜ ๋А๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ GCC ๋‚˜ ์ปค๋„์„ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ ํ•œ ๋‘ ์‹œ๊ฐ„์€ ๊ทธ๋ƒฅ ๊ฑธ๋ฆฌ์ง€์š”. ๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด (์•„๋งˆ ๋Œ€๋ถ€๋ถ„ ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) make ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ธ์ž๋กœ `-j` ๋’ค์— ๋ช‡ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์ˆซ์ž๋ฅผ ์ ์–ด์„œ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` $ make -j8 ``` ์„ ํ•˜๋ฉด make ๊ฐ€ 8 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์— ๋‚˜๋‰˜์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ make ์†๋„๊ฐ€ ์›”๋“ฑํ•˜๊ฒŒ ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ ์ฝ”์–ด ๊ฐœ์ˆ˜ + 1 ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ฝ”์–ด ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋ฆฌ๋ˆ…์Šค ํ„ฐ๋ฏธ๋„์˜ ๊ฒฝ์šฐ ``` $ make -j$(nproc) ``` ์œผ๋กœ ํ•˜๋ฉด `$(nproc)` ์ด ์•Œ์•„์„œ ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ˜„์žฌ ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ขŒ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ถ๊ธˆํ•œ ๊ฒƒ์ด๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ผญ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ๊ฐ•์ขŒ์— ๊ด€๋ จ๋œ ๊ฒƒ์ด๋ผ๋ฉด ์–ด๋– ํ•œ ๊ฒƒ๋„ ์งˆ๋ฌธํ•ด ์ฃผ์…”๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณผ ๋ฌธ์ œ๋„ ์ • ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”. ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์‹  ๊ฐ•์ขŒ๋Š” \<์”น์–ด๋จน๋Š” C++ - \<19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)\>\> ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์งค ์ˆ˜์ค€๊นŒ์ง€ ๊ฐ•์ขŒ๋ฅผ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ๊ฐ•์ขŒ๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ง์•„์ฃผ์„ธ์š” [๋‹ค์Œ ๊ฐ•์ขŒ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ](https://modoocode.com/135) ๋Œ“๊ธ€์ด 37 ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค\! ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ๊ฐ•์ขŒ์— ๊ด€๋ จ ์—†์ด ๊ถ๊ธˆํ•œ ๋‚ด์šฉ์€ [์—ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”](https://forum.modoocode.com/) ๋‹ค์Œ์œผ๋กœ ๋กœ๊ทธ์ธ ๋˜๋Š” ์ง์ ‘ ์ž…๋ ฅํ•˜์„ธ์š” (๋Œ“๊ธ€ ์ˆ˜์ •์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค) ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/ACg8ocK_ep4iKppG0olhJhUh4hQXdZ6Ym-Snki_nvo4XgNrFL45mNw=s96-c) ํ—ˆ์šฐ์ง„2025-08-07 16:08:30.495617 ์ตœ์ข… ์ •๋ฆฌ ๋ถ€๋ถ„์˜ Makefile ์ฝ”๋“œ๋ฅผ C ๋ฒ„์ „์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋˜‘๊ฐ™์€๋ฐ ๋‹ค์Œ์˜ ๋ถ€๋ถ„์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1. make DEBUG=1 ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ -g ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋ผ์„œ gdb๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 2. BIN\_DIR = ./bin ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ /bin ํด๋” ์•ˆ์— main ์‹คํ–‰ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 3. notdir ํ•จ์ˆ˜๋ฅผ ๋นผ๊ณ  ๋Œ€์‹ ์— patsubst ๋ถ€๋ถ„์„ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. OBJS = \$(patsubst \$(SRC\_DIR)/%.c,\$(OBJ\_DIR)/%.o,\$(SRCS)) \# Makefile CC = gcc ifeq (\$(DEBUG), 1) CFLAGS = -Wall -Wextra -g -O0 else CFLAGS = -Wall -Wextra -O2 endif SRC\_DIR = ./src OBJ\_DIR = ./obj BIN\_DIR = ./bin TARGET = \$(BIN\_DIR)/main all: \$(TARGET) SRCS = \$(wildcard \$(SRC\_DIR)/\*.c) OBJS = \$(patsubst \$(SRC\_DIR)/%.c,\$(OBJ\_DIR)/%.o,\$(SRCS)) DEPS = \$(OBJS:.o=.d) \$(OBJ\_DIR): mkdir -p \$(OBJ\_DIR) \$(BIN\_DIR): mkdir -p \$(BIN\_DIR) \$(OBJ\_DIR)/%.o : \$(SRC\_DIR)/%.c \| \$(OBJ\_DIR) \$(CC) \$(CFLAGS) -c \$\< -o \$@ -MD \$(TARGET) : \$(OBJS) \| \$(BIN\_DIR) \$(CC) \$(CFLAGS) \$(OBJS) -o \$@ .PHONY: clean clean: rm -rf \$(OBJ\_DIR) \$(BIN\_DIR) -include \$(DEPS) ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ^^2024-07-26 02:55:07.617106 ^^ ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/ACg8ocJeV4pzLdaNWvpu73FJ2siDcOmVY9omDOzR2gETwsdEE0tj92uI=s96-c) ์ดํ•œ์žฌ2024-04-07 01:37:44.467766 ์ข‹์€ ์ž๋ฃŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๋ ‡๊ฒŒ ์ดํ•ด๊ฐ€ ์ž˜๋˜๊ณ  ์ „๋‹ฌ๋ ฅ์ด ์ข‹์€ ๋ธ”๋กœ๊ทธ ๊ธ€์€ ์˜ค๋žœ๋งŒ์— ๋ณด๋„ค์š”. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/ACg8ocLewo0m2BxpEpXUaK9unIr084FmcJwvx0btz_naRP1L=s96-c) ๊น€๋ฏผ๊ฒธ2024-01-24 15:03:09.492404 ์ดํ•ด ์™„์ „ ์ž˜๋˜๋„ค์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/ACg8ocKbKSKSPU6lL67fI4DKxqnBkmo-6HotdRcDqQU3mQAXsRCr=s96-c) ํžˆ๋งˆ๋งˆ2023-10-19 11:27:45.472561 ์™€ ์ •๋ง ์ตœ๊ณ ๋„ค์š”!!!!! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/AGNmyxbvhZq9R5BRVcqPhdyxcFuKripAkAvl0uFZhtjh5rg=s96-c) GroundP2023-05-10 02:11:01.781 ์ข‹์€ ๊ฐ•์˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค^^ ์ด๋ฏธ ๋นŒ๋“œํ•œ ํŒŒ์ผ๋“ค ์ œ์™ธํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋งŒ ๋นŒ๋“œํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a/ALm5wu38pax8RtVP0_hy3OM6XZIAaQwHdkJL3AChPYk=s96-c) ๋ฐ๋ธŒํ‚น2022-09-30 04:13:06.194 \-I ๋ฅผ ํ†ตํ•ด ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ์ธํด๋ฃจ๋“œ ํ–ˆ์„๋•Œ -include \*.d ๊ณผ์ •(.d ์ƒ์„ฑ -M \> .d)ํฌํ•จ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์ด๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ๊ฒŒ ๋งž์„๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด .d ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  includeํ•˜๋Š” ๊ณผ์ •์€ ์–ด๋–จ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์œ ์šฉํ• ๊นŒ์š”? ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  -I์— ๋ณ„๋„๋กœ ๊ฒฝ๋กœ์ถ”๊ฐ€ ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ธ๊ฒƒ์ผ๊นŒ์š”? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GjuOB-BSZ9HQc1dfYjbBVA0Bsb64Wqc0dB6nprFj9s=s96-c) Lee Kanghee2022-03-29 15:48:49.631 obj ํŒŒ์ผ์„ ๋งŒ๋“คํ•„์š”์—†์ด prerequisite์— .o ํŒŒ์ผ์„ ๋ช…์‹œํ•ด์ฃผ์–ด๋„ implicit rule์— ์˜ํ•ด์„œ ์ž๋™์˜ .cpp๋กœ๋ถ€ํ„ฐ .o๋กœ ์ปดํŒŒ์ผํ•ด์ฃผ๊ณ  ๊ทธ๊ฑธ prerequisite์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ๋กœ ์•„๋Š”๋ฐ ํ˜น์‹œ ์œ„์ฒ˜๋Ÿผ ๋‹ค ์ ๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š”๊ฑด๊ฐ€์š”?? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiAJMl6mSpdpQfSjfbpezQyXGuVKDPhJtxcFuyCTg=s96-c) Gilbert Kim2022-02-14 00:57:48.097 ์ข‹์€ ๊ฐ•์˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A=s96-c) Jaebum Lee2022-02-16 04:44:19.917 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ad2022-01-19 12:47:53.072 So helpful\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ๊ฐ•์˜๋ฏผ2021-11-22 08:08:59.891 ์ •๋ง ์ž˜ ๋ฐฐ์šฐ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GjVCEnvuwTLYc2j1ltZRA4bfpahXuGzbNjSrYQDrA=s96-c) Chris Moon2021-09-28 06:46:48.145 ์ž˜ ๋ฐฐ์šฐ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค. ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14Gi0p9AY-Kupc9lqjACx5zvfWeVWbthCBjFPc0-bEg=s96-c) ๋ณ‘์šฑ์ด2021-08-15 07:24:23.791 ์—ญ์‹œ ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ๊น€์ •๋ฏผ2021-08-12 09:59:45.205 ์ œ ๋ธ”๋กœ๊ทธ์— ๊ฐ•์˜ ์ค‘๊ฐ„์ค‘๊ฐ„ ์“ฐ์ธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ์š”? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ์œ ์ง€ํ›ˆ2021-07-25 13:00:52.878 all : main ์ด๊ฒƒ์€ ์™œ ์žˆ๋Š” ๊ฑด๊ฐ€์š”? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A=s96-c) Jaebum Lee2022-02-16 04:44:47.605 ๋ณดํ†ต make ํ•  ๋•Œ ์ „์ฒด๋ฅผ ๋นŒ๋“œํ•˜๋ผ๋Š” ์˜๋ฏธ๋กœ make all ์ด๋ผ๊ณ  ๋งŽ์ด ์”๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ty2021-05-06 04:53:22.369 ์ข‹์€ ๊ฐ•์˜ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜คํƒ€ ๋ฆฌํฌํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข…์ •๋ฆฌ ์ค‘๊ฐ„๋ถ€๋ถ„์—์„œ \>\> ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” foo.cc bar.cc main.cc ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด nodir ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. nodir ์€ ์•ž์— ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์ถ”์ถœํ•ด์ค๋‹ˆ๋‹ค. nodir -\> notdir์ด์ฃ ? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ty2021-05-06 05:06:48.265 ์ œ์ผ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ \>\> ์œผ๋กœ ํ•˜๋ฉด \$(proc) ์ด ์•Œ์•„์„œ ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ˜„์žฌ ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. \$(proc) -\> \$(nproc) ์ธ๋“ฏํ•ฉ๋‹ˆ๋‹ค ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A=s96-c) Jaebum Lee2021-06-25 05:36:01.573 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh6.googleusercontent.com/-lOhx3ABnj2w/AAAAAAAAAAI/AAAAAAAAAAA/AMZuucnhbOmeyHEQBGNpjxfeNYlyHD4e6w/s96-c/photo.jpg) Harry2020-12-08 13:56:43.121 ๊ถ๊ธˆํ•œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. target์—†์ด make๋ช…๋ น์–ด๋งŒ ์ž…๋ ฅํ•˜๋ฉด ์ฒ˜์Œ์œผ๋กœ ๋งŒ๋‚˜๋Š” target์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ %.o:์™€ ๊ฐ™์€ target์€ ๋ฌด์‹œํ•˜๋Š”๊ฑฐ ๊ฐ™๋”๋ผ๊ตฌ์š”. ๋ถ„๋ช… all์ด %.o๋ณด๋‹ค ์•„๋ž˜์— ์œ„์น˜ํ•ด ์žˆ๋„๋ก Makefile์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ make๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด make all์„ ํ•œ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์™œ ๊ทธ๋Ÿฐ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. %.o: %.c \${CC} \${CFALGS} -c \$\< all: \${NAME} ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ %.o ํƒ€์ผ“์œ„์— clean ํƒ€๊ฒŸ์„ ์จ์ฃผ๋ฉด make ์‹คํ–‰์‹œ make clean์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์™œ %.o๋Š” ๋ฌด์‹œํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋˜ .c.o์˜ ํƒ€๊ฒŸ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌด์‹œํ•˜๋˜๋ฐ ๊ฐ™์€ ์ด์œ ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ฒˆ ์งธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ \$\< ์ž…๋ ฅ ํ™”์ผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ก ์˜ ์˜ค๋ฅธ์ชฝ์— ์˜ค๋Š” ํŒจํ„ด์„ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. \$@ ์ถœ๋ ฅ ํ™”์ผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ก ์˜ ์™ผ์ชฝ์— ์˜ค๋Š” ํŒจํ„ด์„ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. \$\* ์ž…๋ ฅ ํ™”์ผ์—์„œ ๊ผฌ๋ฆฌ๋ง(.c, .s ๋“ฑ)์„ ๋–ผ๋„จ ํ™”์ผ๋ช…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ •์˜๋ฅผ ์จ๋†จ์Šต๋‹ˆ๋‹ค. http://doc.kldp.org/KoreanDoc/html/gcc\_and\_make/gcc\_and\_make-3.html ํ•ด๋‹น ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. ์„ ์ƒ๋‹˜๊ป˜์„œ ์จ๋†“์€ ์ •์˜์™€ ๋‹ค๋ฅธ๊ฑฐ ๊ฐ™์•„์„œ ๋ฌธ์˜๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๋ฆฌํ•ด๋†“์œผ์‹  ์ž๋ฃŒ๋“ค์ด ๋„ˆ๋ฌด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A=s96-c) Jaebum Lee2020-12-08 22:53:26.178 make ์„ค๋ช…์„ ๋ณด๋ฉด "By default, make starts with the first target (not targets whose names start with โ€˜.โ€™)." ์ด๋ผ๊ณ  ์“ฐ์—ฌ์ ธ ์žˆ๋Š”๋ฐ, %.o ์—ญ์‹œ . ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒ€๊ฒŸ ์ด๋ฆ„์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š”๊ฒƒ ๊ฐ™๋„ค์š”. ๊ทธ๋ž˜์„œ ๋ฌด์‹œ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. \$\< ์„ค๋ช…์˜ ๊ฒฝ์šฐ ์ œ ์„ค๋ช…์ด ๋งž์Šต๋‹ˆ๋‹ค. (https://www.gnu.org/software/make/manual/html\_node/Automatic-Variables.html) \$\< ๋Š” ์˜ค๋ฅธ์ชฝ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ๋งŒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์ „์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด \$^ ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh6.googleusercontent.com/-lOhx3ABnj2w/AAAAAAAAAAI/AAAAAAAAAAA/AMZuucnhbOmeyHEQBGNpjxfeNYlyHD4e6w/s96-c/photo.jpg) Harry2020-12-22 06:59:46.108 ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ํฐ ๋„์›€์ด ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ์ข‹์€ ํ•˜๋ฃจ๋˜์„ธ์š”\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14Giw8PYbCaQL7EcxDTD9z7DgV1KGFRpCOEDeKhpn) ํ•œ์šฐ์„ญ2020-09-21 06:53:31.842 ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ๊ท€์ค‘ํ•œ ๊ฐ•์˜๋ฅผ ๊ณต๊ฐœํ•˜์—ฌ ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์„ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํด๋”(์˜ˆ:bin)๋ฅผ ๋งŒ๋“ค๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์‹คํ–‰ํŒŒ์ผ์„ ๊ทธ ํด๋”์— ์œ„์น˜์‹œํ‚ค๋ ค๋ฉด Makefile์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ• ์ง€ ์–ด๋ ค์›Œ์„œ ์—ฌ์ญ™๋‹ˆ๋‹ค^^; ์ˆ˜๊ณ ํ•˜์„ธ์š”^^ ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A=s96-c) Jaebum Lee2020-10-16 05:25:07.105 \$(CC) \$(CXXFLAGS) \$(OBJECTS) -o \$(TARGET) \$(LDFLAGS) ์ด ๋ถ€๋ถ„์„ \$(CC) \$(CXXFLAGS) \$(OBJECTS) -o bin/\$(TARGET) \$(LDFLAGS) ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”? ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) kaze2020-09-20 01:01:14.372 gcc ์ปดํŒŒ์ผ ํ™˜๊ฒฝ์€ ๋น„์ฅฌ์–ผ ์ŠคํŠœ๋””์˜ค์ฒ˜๋Ÿผ ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ์žก๊ณ  ๋””๋ฒ„๊น…ํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋Š”๊ฒƒ์ธ๊ฐ€์š”? ๋งค๋ฒˆ ๊ณ ์น˜๊ณ  ์ปดํŒŒ์ผํ•˜๊ณ  txt๋กœ ๋กœ๊ทธํŒŒ์ผ ๋งŒ๋“ค๊ณ  ๋ณด๊ณ  ๋‹ค์‹œ ๊ณ ์น˜๊ณ  ์ปดํŒŒ์ผํ•˜๊ณ  txt๋กœ ๋กœ๊ทธํŒŒ์ผ ๋งŒ๋“ค๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-09-21 05:05:13.256 ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ gdb ๋‚˜ lldb ๋ผ๋Š” ํ›Œ๋ฅญํ•œ ๋””๋ฒ„๊ฑฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ ์—ญ์‹œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ๊น€ํ™์ˆ™2020-09-04 08:38:46.289 make -j ์˜ต์…˜ ์‚ฌ์šฉ์‹œ \$(nproc)๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„๊ฑฐ ๊ฐ™๋„ค์š”. \$(cmd)ํ˜•ํƒœ๋กœ ๋ช…๋ น์–ด cmd๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด cmd๋ช…๋ น์˜ ๊ฒฐ๊ณผ๊ฐ€ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. nproc๋Š” ๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์—์„œ ์‹œ์Šคํ…œ CPU์˜ ์ฝ”์–ด์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์ด๊ตฌ์š”. ์ข‹์€ ๊ฐ•์ขŒ ์ž˜ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Make๋„ ์• ๋งคํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด์„œ ์ข‹์Šต๋‹ˆ๋‹ค. CMake ๋ถ€๋ก๋„ ์žˆ์œผ๋ฉด ์–ด๋–จ๊นŒํ•˜๋Š” ๋ฌด๋ฆฌํ•œ (?) ์ œ์•ˆ์„ ํ•ด๋ด…๋‹ˆ๋‹ค. ์ฝ”๋กœ๋‚˜ ์กฐ์‹ฌํ•˜์‹œ๊ณ  ๊ฑด๊ฐ•ํ•˜์‹œ๊ธฐ๋ฅผ ๋น•๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-09-06 22:55:24.492 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ถ”ํ›„์— ์ถ”๊ฐ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) dd2020-08-03 16:11:08.570 ๋„๋Œ€์ฒด ๋ญํ•˜์‹œ๋Š” ๋ถ„์ด๊ธธ๋ž˜.. ์ด๋Ÿฐ ๊ท€ํ•œ ๊ฐ•์˜๋ฅผ ๋ฌด๋ฃŒ๋กœ ํ•ด์ฃผ์‹œ๋Š”์ง€ ใ… ใ…  ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-08-03 22:34:44.604 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋ฏธ๋กœ ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) ๊น€์ค€์ˆ˜2020-07-08 03:05:03.475 ์•ˆ๋…•ํ•˜์„ธ์š”! ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ์—ฌ์ญค๋ด…๋‹ˆ๋‹ค! ์ž๋™์œผ๋กœ prerequisite ๋งŒ๋“ค๊ธฐ ๋ถ€๋ถ„์—์„œ main.d๋ฅผ includeํ•˜๋ฉด %.o: %.cc %.h \$(CC) \$(CXXFLAGS) -c \$\< ์—์„œ main.d๊ฐ€ ํŒจํ„ด๋งค์นญ๋˜์„œ \$(CC) \$(CXXFLAGS) -c \$\<๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฑด๊ฐ€์š”? ์ด๋ ‡๋‹ค๋ฉด ํŒจํ„ด์ด ๋งž์ง€ ์•Š๋Š”๋ฐ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ์š”. ์•„๋‹ˆ๋ฉด main.d๋งŒ includeํ•˜๋ฉด ๋งค์นญ๋˜๋Š” ๊ฒƒ ์—†์ด ์ž๋™์œผ๋กœ main.o๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฑด๊ฐ€์š”? ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-07-08 09:22:15.557 main.d ๋ฅผ include ํ•˜๊ฒŒ ๋˜๋ฉด main.d ์˜ ๋‚ด์šฉ์ด Makefile ์— ๋ชจ๋‘ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋งˆ์น˜ \#include ๋ฅผ ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ์š”) ์˜ˆ๋ฅผ ๋“ค์–ด์„œ main.d ์— ์•„๋ž˜ ์ฒ˜๋Ÿผ ์จ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. main.o: a.h b.h main.cc ๊ทธ๋ ‡๋‹ค๋ฉด make ๋Š” ๊ฐ™์€ target ์˜ ๋Œ€ํ•œ prerequisite ๋ฅผ ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ฏ€๋กœ main.o: main.cc main.h ์™€ main.o: a.h b.h main.cc ๊ฐ€ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ ธ์„œ ๋งˆ์น˜ main.o: a.h b.h main.cc main.h \$(CC) \$(CXXFLAGS) -c \$\< ๋ฅผ ์‚ฌ์šฉํ•œ ๋“ฏํ•œ ํšจ๊ณผ๋ฅผ ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—†์Œ](https://modoocode.com/img/unknown_person.png) asdf2020-07-02 06:56:51.939 ์ •๋ง ๋„์›€์ด ๋งŽ์ด ๋ฉ๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-07-02 22:14:33.788 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14Gi4jMRi14mH3FTv_sve8uevK1Rf658RtNRSW43CyA) ๊ณ ์˜์šฐ2020-06-30 23:53:39.358 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ - ![ํ”„๋กœํ•„ ์‚ฌ์ง„](https://lh3.googleusercontent.com/a-/AOh14GiGD6_xA3lRUslvzDd2zyR3cfeOYd0npkH2dOlp0A) Jaebum Lee2020-07-01 06:45:56.145 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค\! ๋‹ต๊ธ€ ๋‹ฌ๊ธฐ๋‹ต๊ธ€ ์‚ญ์ œ ๋Œ“๊ธ€ ๋” ๋ณด๊ธฐ
Readable Markdown
์ž‘์„ฑ์ผ : 2020-06-10 ์ด ๊ธ€์€ 105837 ๋ฒˆ ์ฝํ˜”์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์—์„œ๋Š” - make ์˜ ์ž‘๋™ ์ดํ•ด - Makefile ๋ฌธ๋ฒ• ์ดํ•ด - ๋งŒ๋Šฅ Makefile ๋งŒ๋“ค๊ธฐ ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ![](https://modoocode.com/img/ChewingCpplogo.webp) ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ๊ฐ•์ขŒ ๋ถ€ํ„ฐ๋Š” ์”น์–ด๋จน๋Š” C++ ์‹œ๋ฆฌ์ฆˆ์˜ ๋ถ€๋ก ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ C++ ์–ธ์–ด ์ž์ฒด์™€๋Š” ์ง์ ‘ ๊ด€๋ จ์€ ์—†์ง€๋งŒ ์‹ค์ œ๋กœ C++ ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ง€์‹๋“ค๊ณผ ํˆด๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฒซ ๋ฒˆ์งธ ํƒ€์ž๋กœ Makefile ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์‹  ๋ถ„๋“ค์€ ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ์—์„œ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ์ปดํŒŒ์ผ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•Œ์•„์„œ ์ปดํŒŒ์ผ ๋˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์‰˜ ์ƒ์—์„œ ์ปดํŒŒ์ผ์„ ํ•˜๋ ค๋ฉด ์–ด๋–ค ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ณ , ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ง€ ์ง์ ‘ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ํŒŒ์ผ๋“ค์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ๋งค๋ฒˆ ๊ทธ๋ ‡๊ฒŒ ์นœ๋‹ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” make ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ํ”„๋กœ๊ทธ๋žจ์€ Makefile ๋ผ๋Š” ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ฃผ์–ด์ง„ ๋ฐฉ์‹๋Œ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ๋“ค์„ ๋ช…๋ น์–ด ํ•œ ๋ฒˆ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” make ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ Makefile ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € make ๊ฐ€ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์™„์„ฑ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ์—ฌ๋Ÿฌ๋ถ„์˜ ๋จธ๋ฆฌ ์†์œผ๋กœ ๋– ์˜ค๋ฅด๋Š” ๊ณผ์ •์€ ๋ฐ”๋กœ ์ปดํŒŒ์ผ(Compile) ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ์ด๋ผ๋Š” ๊ณผ์ •์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด `foo.h` ์— ์ •์˜๋œ `foo` ํ•จ์ˆ˜์™€ `bar.h` ์— ์ •์˜๋œ `bar` ํ•จ์ˆ˜๋ฅผ `main` ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. - foo.h ``` int foo(); ``` - foo.cc ``` #include <iostream> #include "foo.h" int foo() { std::cout << "Foo!" << std::endl; return 0; } ``` - bar.h ``` int bar(); ``` - bar.cc ``` #include <iostream> #include "bar.h" int bar() { std::cout << "Bar!" << std::endl; return 0; } ``` - main.cc ``` #include "bar.h" #include "foo.h" int main() { foo(); bar(); } ``` ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ``` $ g++ -c main.cc ``` `g++` ์— ์ „๋‹ฌํ•˜๋Š” `-c` ๋ช…๋ น์–ด๋Š” ์ธ์ž ๋‹ค์Œ์— ์ฃผ์–ด์ง€๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•ด์„œ ๋ชฉ์  ํŒŒ์ผ(object file) ์„ ์ƒ์„ฑํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜์˜€๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด `main.o` ๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` $ ls main.o main.o ``` ์ด `main.o` ๋Š” `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main.o` ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด ``` $ objdump -S main.o main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 push %rbp 5: 48 89 e5 mov %rsp,%rbp 8: e8 00 00 00 00 callq d <main+0xd> d: e8 00 00 00 00 callq 12 <main+0x12> 12: b8 00 00 00 00 mov $0x0,%eax 17: 5d pop %rbp 18: c3 retq ``` ์™€ ๊ฐ™์ด `main.cc` ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋“ค์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ `main.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main.o` ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์Šฌ์ฉ ๋ณด๋ฉด `foo` ๋‚˜ `bar` ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ํ•˜๋‚˜๋„ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `main.o` ์ž์ฒด๋กœ๋Š” ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด `main.o` ์—๋Š” `foo` ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ผ\! ๋ผ๋Š” ๋‚ด์šฉ๋งŒ ์žˆ์ง€, `foo` ๋Š” ์–ด๋””์— ์žˆ๊ณ  ์ด๋Ÿฌ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” `foo` ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” `foo.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ `foo.o` ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `bar` ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” `bar.cc` ๋ฅผ ์ปดํŒŒ์ผ ํ•ด์„œ ๋งŒ๋“  `bar.o` ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ฐ๊ฐ์˜ `main.o, foo.o, bar.o` ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ฒ ์ฃ . ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋งํ‚น(Linking) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ![](https://modoocode.com/img/cpp/a.1.1.png) ๋งํ‚น์ด ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋งํฌ ํ•˜๋Š” ์ž‘์—… ์ธ ์ด์œ ๋Š” ์‹ค์ œ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ํฉ์–ด์ ธ ์žˆ๋˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋“ค์„ ํ•œ ๋ฐ ๋ฌถ์–ด์„œ ๋งํฌํ•ด์ฃผ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ๊ณผ์ •์—์„œ `main` ํ•จ์ˆ˜ ์•ˆ์— `foo` ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ์œ„์น˜๋ฅผ ์ฐพ๊ณ  ์ œ๋Œ€๋กœ ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋งํ‚น์— ๊ด€ํ•ด์„œ ์ด์•ผ๊ธฐ๋งŒ ํ•ด๋„ ํ•œ์ฐธ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋‹จ ์ด ๊ธ€์˜ ๋ชฉํ‘œ๋Š” ๋นŒ๋“œ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ค„์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋งํ‚น ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ชฉ์ ํŒŒ์ผ์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ``` $ g++ main.o foo.o bar.o -o main ``` ์—ฌ๊ธฐ์„œ `-o` ์˜ต์…˜์€ ๊ทธ ๋’ค์— ๋งํ‚น ํ›„์— ์ƒ์„ฑํ•  ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ `main` ์ด๋ผ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๊ณ  ๋งŒ์•ฝ์— ์ด๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๋ƒฅ `./a.out` ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋””ํดํŠธ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ `main` ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ ``` Foo! Bar! ``` ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ผ๋‹จ ์œ„์™€ ๊ฐ™์ด `main` ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋ ฅํ•œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ญ‰ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด; ``` $ g++ -c main.cc $ g++ -c foo.cc $ g++ -c bar.cc $ g++ main.o foo.o bar.o -o main ``` ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด ๋งค ๋ฒˆ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค๋งŒ, ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์ณ์•ผํ•  ๋ช…๋ น์–ด๊ฐ€ ๋” ๋งŽ์•„์ง€๊ฒŒ ๋˜์„œ ๋ณต์žกํ•˜๊ฒ ์ง€์š” (ํŠนํžˆ ํŒŒ์ผ๋“ค์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š”๋‹ค๋ฉด ๋ง์ด์ฃ .) ๋ฌผ๋ก  ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์กฐ๊ธˆ ์•„์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด > ๊ทธ๋ƒฅ ์œ„ ๋ช…๋ น์–ด๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋ผ๊ณ  ๋ฌผ์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค๋ฉด ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์—ฌ๋Ÿฌ๋ถ„์ด `main.cc` ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ๋Š” ``` $ g++ -c main.cc $ g++ main.o foo.o bar.o -o main ``` ๋”ฑ ์ด ๋‘ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด `main` ํŒŒ์ผ์„ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด์„œ `foo` ๋‚˜ `bar` ์˜ ์ปดํŒŒ์ผ ๋œ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•˜์ง€๋งŒ ์œ„ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๊ฒŒ ๋œ๋‹ค๋ฉด ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”๋„ ์ „์ฒด ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋งค์šฐ ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ make ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๋ช…๋ น๋งŒ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ž ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  make ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ make ๋ฅผ ์œ„ํ•œ Makefile ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. make ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์ฃผ์–ด์ง„ ์‰˜ ๋ช…๋ น์–ด๋“ค์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์–ด๋– ํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋‹ด์€ ํŒŒ์ผ์„ Makefile ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, make ๋ฅผ ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” Makefile ์„ ์ฐพ์•„์„œ ์ฝ์–ด๋“ค์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Makefile ์—๋Š” ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ฑด์„ ๊ธฐ์ˆ ํ• ๊นŒ์š”? ``` target โ€ฆ : prerequisites โ€ฆ (ํƒญ)recipe โ€ฆ โ€ฆ ``` Makefile ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด 3 ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. make ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ `make abc` ๊ณผ ๊ฐ™์ด ์–ด๋– ํ•œ ๊ฒƒ์„ make ํ•  ์ง€ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ํƒ€๊ฒŸ(target) ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์ผ `make abc` ๋ฅผ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํƒ€๊ฒŸ ์ค‘์— `abc` ๋ฅผ ์ฐพ์•„์„œ ์ด์— ๋Œ€์‘๋˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋“ค์˜ ๋‚˜์—ด์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์€ recipe ์ž๋ฆฌ์— ๋ช…๋ น์–ด๋ฅผ ์“ธ ๋•Œ ๋ฐ˜๋“œ์‹œ ํƒญ ํ•œ ๋ฒˆ์œผ๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•ด์ค˜์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์š”์ฆ˜์˜ ํŽธ์ง‘๊ธฐ์˜ ๊ฒฝ์šฐ (์˜ˆ๋ฅผ ๋“ค์–ด VSCode), ์ž๋™์œผ๋กœ ํƒญ์„ ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์„ ํ…๋ฐ make ๊ฐ€ Makefile ์„ ์ œ๋Œ€๋กœ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํƒญ์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค\! ์ฃผ์–ด์ง„ ํƒ€๊ฒŸ์„ make ํ•  ๋•Œ ์‚ฌ์šฉ๋  ํŒŒ์ผ๋“ค์˜ ๋ชฉ๋ก ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ์˜์กด ํŒŒ์ผ(dependency) ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด๋“œ๋ ค์•ผ ํ•  ํŒŒ์ผ๋“ค์„ ์จ๋†“์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ ์ฃผ์–ด์ง„ ํŒŒ์ผ๋“ค์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ํƒ€๊ฒŸ์ด ๋” ๋‚˜์ค‘์— ์ˆ˜์ •๋˜์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ์ด์ „์— ํƒ€๊ฒŸ์ด ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํƒ€๊ฒŸ์ด `main.o` ์ด๊ณ , ๋ช…๋ น์–ด๊ฐ€ `g++ -c main.cc` ๋ผ๋ฉด, ํ•„์š” ์กฐ๊ฑด๋“ค์€ `main.cc`, `foo.h`, `bar.h` ๊ฐ€ ๋˜๊ฒ ์ฃ . ์™œ๋ƒํ•˜๋ฉด ์ด๋“ค ํŒŒ์ผ๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐ”๋€๋‹ค๋ฉด `main` ์„ ์ƒˆ๋กœ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ฐ˜๋ฉด์— `main.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด `main.cc`, `foo.h`, `bar.h` ๋“ค์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋ผ๋ฉด, ๊ตณ์ด `main.o` ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Makefile ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` foo.o : foo.h foo.cc g++ -c foo.cc bar.o : bar.h bar.cc g++ -c bar.cc main.o : main.cc foo.h bar.h g++ -c main.cc main : foo.o bar.o main.o g++ foo.o bar.o main.o -o main ``` ์ฃผ์˜ ์‚ฌํ•ญ ์œ„ Makefile ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์•„๋งˆ ์‹คํ–‰์ด ์•ˆ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒญ์ด ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๋€Œ์–ด์„œ ๊ทธ๋Ÿฐ๋ฐ์š”, ์ œ๋Œ€๋กœ Makefile ์„ ๋งŒ๋“œ์‹œ๊ธฐ ์œ„ํ•ด์„œ๋Š” g++ ์•ž์— ์˜ค๋Š” ์ŠคํŽ˜์ด์Šค ๋‘ ๋ฒˆ์„ ํƒญ์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์ €์žฅํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์ธ `main` ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— `make main` ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ``` $ make main g++ -c foo.cc g++ -c bar.cc g++ -c main.cc g++ foo.o bar.o main.o -o main ``` ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ `main` ์ด ์ž˜ ๋งŒ๋“ค์–ด์ง์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ํ•œ ๋ฒˆ๋„ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ `make main` ์„ ์‹คํ–‰ํ•˜๋ฉด make ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 1. `make main` ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด `main` ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. 2. ์˜ค. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด `foo.o bar.o main.o` ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. 3. `foo.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `foo.cc` ๋„ค? ์•„์ง `foo.o` ๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฒ ๊ตฐ\! 4. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `bar.o, main.o` ๋„ ์ปดํŒŒ์ผ 5. ์ž ์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ `g++ foo.o bar.o main.o -o main` ๋ฅผ ์‹คํ–‰ํ•ด์•ผ์ง€ ๋งŒ์•ฝ์— ์—ฌ๋Ÿฌ๋ถ„์ด `make main` ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ์ƒํƒœ์—์„œ `foo.cc` ๋งŒ ์ˆ˜์ •ํ•˜์˜€๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์žฌ์ปดํŒŒ์ผ ๋ฉ๋‹ˆ๋‹ค. 1. `make main` ์ด๋‹ˆ๊นŒ Makefile ์—์„œ ํƒ€๊ฒŸ์ด `main` ์ธ ๋…€์„์„ ์ฐพ์•„๋ณด์ž. 2. ์˜ค. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด `foo.o bar.o main.o` ์ด๋„ค? ์ด๋“ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ฐ๊ฐ์˜ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋œ ํƒ€๊ฒŸ๋“ค์„ ์ฐพ์•„๋ณด์ž. 3. `foo.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `foo.cc` ๋„ค? ๊ทธ๋Ÿฐ๋ฐ `foo.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„ ๋ณด๋‹ค `foo.cc` ์˜ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋” ๋‚˜์ค‘์ด๊ตฐ! ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด 4. `bar.o` ์˜ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด `bar.cc` ์ธ๋ฐ, `bar.o` ์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์ด `bar.cc` ์˜ ์ˆ˜์ • ์‹œ๊ฐ„ ๋ณด๋‹ค ๋‚˜์ค‘์ด๋„ค. ๊ตณ์ด ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒ ์–ด 5. `main.o` ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์‹œ ์•ˆ๋ฐ”๊ฟ”๋„ ๋˜๊ฒ ๊ตฐ\! 6. `main` ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค ์ค‘ `foo.o` ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ ๋‚ด ๋ช…๋ น์–ด๋“ค๋„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ๊ฒ ์–ด. ๋”ฐ๋ผ์„œ ๋”ฑ ํ•„์š”ํ•œ `g++ -c foo.cc` ์™€ `g++ foo.o bar.o main.o -o main` ๋งŒ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์žฌ๋ฏธ์žˆ๊ฒŒ๋„ Makefile ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` CC = g++ ``` ์œ„ ๊ฒฝ์šฐ `CC` ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๋Š”๋ฐ, ์ด์ œ Makefile ๋‚ด์—์„œ `CC` ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฌธ์ž์—ด์ธ `g++` ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `$(CC)` ์™€ ๊ฐ™์ด `$()` ์•ˆ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` CC = g++ foo.o : foo.h foo.cc $(CC) -c foo.cc ``` ๋Š” ์‚ฌ์‹ค ``` CC = g++ foo.o : foo.h foo.cc g++ -c foo.cc ``` ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ช…๋ น์ด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ์ด ๋ถ€๋ถ„์€ TMI ์ด๋ฏ€๋กœ ๋ฐ”์˜์‹  ๋ถ„๋“ค์€ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค. Makefile ์ƒ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ = ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ `:=` ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ์‚ด์ง ๋‹ค๋ฆ…๋‹ˆ๋‹ค. \= ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€์„ ๋•Œ, ์ •์˜์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜๊ธฐ ๋  ๋•Œ ๊นŒ์ง€ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ •ํ•ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` B = $(A) C = $(B) A = a ``` `C` ์˜ ๊ฒฝ์šฐ `B` ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ , `B` ์˜ ๊ฒฝ์šฐ `A` ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ `B =` ๋ฅผ ์‹คํ–‰ํ•œ ์‹œ์ ์—์„œ `A` ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ `B` ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ `=`๋กœ ์ •์˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— `A` ๊ฐ€ ์‹ค์ œ๋กœ ์ •์˜๋  ๋•Œ ๊นŒ์ง€ `B` ์™€ `C` ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰์— `A = a` ๋ฅผ ํ†ตํ•ด `A` ๊ฐ€ `a` ๋กœ ๋Œ€์‘๋˜์–ด์•ผ, `C` ๊ฐ€ `a` ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ``` B := $(A) A = a ``` ๋ฐ˜๋ฉด์— `:=` ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹œ์ ์—์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ `B` ๋Š” ๊ทธ๋ƒฅ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๊ฒ ์ง€์š”. ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ๋Š” `=` ๋‚˜ `:=` ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ - ๋งŒ์ผ ๋ณ€์ˆ˜๋“ค์˜ ์ •์˜ ์ˆœ์„œ์— ํฌ๊ฒŒ ๊ตฌ์• ๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด `=` ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค. - `A =` ์™€ ๊ฐ™์ด ์ž๊ธฐ ์ž์‹ ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด `:=` ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ์ง€ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ ๋ช…์‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋“ค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Makefile ์„ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main ``` make ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ``` $ make main g++ -Wall -O2 -c foo.cc g++ -Wall -O2 -c bar.cc g++ -Wall -O2 -c main.cc g++ -Wall -O2 foo.o bar.o main.o -o main ``` ์™€ ๊ฐ™์ด ์ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. `CC` ์™€ `CXXFLAGS` ๋Š” Makefile ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ๋ณดํ†ต `CC` ์—๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ด๋ฆ„์„, `CXXFLAGS` ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ฃผ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์  ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด๋Š” C++ ์˜ ๊ฒฝ์šฐ ์ด๊ณ , C ์˜ ๊ฒฝ์šฐ CFLAGS ์— ์˜ต์…˜์„ ์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ `g++` ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ต์…˜์œผ๋กœ๋Š” `Wall` (๋ชจ๋“  ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ) ๊ณผ `O2` (์ตœ์ ํ™” ๋ ˆ๋ฒจ 2) ๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Makefile ์— ํ”ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋นŒ๋“œ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค (.o ํŒŒ์ผ๋“ค)์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ``` clean: rm -f $(OBJS) main ``` ์‹ค์ œ๋กœ `make clean` ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ชฉ์  ํŒŒ์ผ๊ณผ `main` ์„ ์ง€์›Œ๋ฒ„๋ฆผ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ์— ์‹ค์ œ๋กœ `clean` ์ด๋ผ๋Š” ํŒŒ์ผ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ `make clean` ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, make ๋Š” clean ์˜ ํ•„์š” ํŒŒ์ผ๋“ค์ด ์—†๋Š”๋ฐ, clean ํŒŒ์ผ์ด ์žˆ์œผ๋‹ˆ๊นŒ clean ํŒŒ์ผ์€ ํ•ญ์ƒ ์ตœ์‹ ์ด๋„ค? recipe ๋ฅผ ์‹คํ–‰ ์•ˆํ•ด๋„ ๋˜๊ฒ ๋„ค\! ํ•˜๋ฉด์„œ ๊ทธ๋ƒฅ `make clean` ๋ช…๋ น์„ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ``` $ ls clean clean $ make clean make: 'clean' is up to date. ``` ์‹ค์ œ๋กœ ๋””๋ ‰ํ† ๋ฆฌ์— `clean` ์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋†“๊ณ  ์‹คํ–‰ํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ `clean` ์€ ์ตœ์‹ ์ด๋ผ๋ฉฐ `recipe` ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” `clean` ์„ `PHONY` ๋ผ๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ง€์š”. ``` .PHONY: clean clean: rm -f $(OBJS) main ``` ์ด์ œ `make clean` ์„ ํ•˜๊ฒŒ ๋˜๋ฉด `clean` ํŒŒ์ผ์˜ ์œ ๋ฌด์™€ ์ƒ๊ด€ ์—†์ด ์–ธ์ œ๋‚˜ ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์ด 3 ๊ฐœ ๋ฐ–์— ์—†์–ด์„œ ๋‹คํ–‰์ด์˜€์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ˆ˜์‹ญ~ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ฐ๊ฐ์˜ ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ ๋นŒ๋“œ ๋ฐฉ์‹์„ ๋ช…์‹œํ•ด์ค€๋‹ค๋ฉด Makefile ์˜ ํฌ๊ธฐ๊ฐ€ ์—„์ฒญ ์ปค์ง€๊ฒ ์ง€์š”. ๋‹คํ–‰์ด๋„ Makefile ์—์„œ๋Š” ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด์„œ ํŠน์ • ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ `recipe` ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ``` foo.o : foo.h foo.cc $(CC) $(CXXFLAGS) -c foo.cc bar.o : bar.h bar.cc $(CC) $(CXXFLAGS) -c bar.cc ``` ์ผ๋‹จ ๋จผ์ € ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด ์œ„ ๋‘ ๋ช…๋ น๋“ค์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ``` %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ``` ๋จผ์ € `%.o` ๋Š” ์™€์ผ๋“œ์นด๋“œ๋กœ ๋”ฐ์ง€๋ฉด ๋งˆ์น˜ `*.o` ์™€ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, `.o` ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„๋“ค์ด ํƒ€๊ฒŸ์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ง€์š”. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `foo.o` ๊ฐ€ ํƒ€๊ฒŸ์ด๋ผ๋ฉด % ์—๋Š” `foo` ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ  `bar.o` ์˜ ๊ฒฝ์šฐ % ์—๋Š” `bar` ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด `foo.o` ๊ฐ€ ํƒ€๊ฒŸ์ผ ๊ฒฝ์šฐ ``` foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c $< ``` ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ํŒจํ„ด์€ ํƒ€๊ฒŸ๊ณผ `prerequisite` ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `recipe` ๋ถ€๋ถ„์—์„œ๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— `foo.cc` ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Makefile ์˜ ์ž๋™ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `$<` ์˜ ๊ฒฝ์šฐ `prerequisite` ์—์„œ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์˜ ์ด๋ฆ„์— ๋Œ€์‘๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ `foo.cc` ๊ฐ€ ๋˜๊ฒ ์ง€์š”. ๋”ฐ๋ผ์„œ ์œ„ ๋ช…๋ น์–ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ``` foo.o: foo.cc foo.h $(CC) $(CXXFLAGS) -c foo.cc ``` ๊ฐ€ ๋˜์–ด์„œ ์ด์ „์˜ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. Makefile ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๋ณ€์ˆ˜๋กœ๋Š” ๊ทธ ์™ธ์—๋„ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด `$@`, `$<`, `$^` ๋“ฑ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ![](https://modoocode.com/img/cpp/a.1.2.png) - `$@` : ํƒ€๊ฒŸ ์ด๋ฆ„์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$<` : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$^` : ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก ์ „์ฒด์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$?` : ํƒ€๊ฒŸ ๋ณด๋‹ค ์ตœ์‹ ์ธ ์˜์กด ํŒŒ์ผ๋“ค์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค. - `$+` : `$^` ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ค‘๋ณต๋œ ํŒŒ์ผ ์ด๋ฆ„๋“ค ๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์œ„ ํŒจํ„ด์œผ๋กœ๋Š” ``` main.o : main.cc foo.h bar.h $(CC) $(CXXFLAGS) -c main.cc ``` ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์— `main.h` ๊ฐ€ ์—†๊ณ  `foo.h` ์™€ `bar.h` ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‚ฌ์‹ค ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ๋Š” ํ•ด๋‹น ์†Œ์Šค ํŒŒ์ผ์ด ์–ด๋– ํ•œ ํ—ค๋”ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ƒ์— ๊ฒฐ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `main.cc` ๊ฐ€ `foo.h` ์™€ `bar.h` ๋ฅผ `include` ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `main.o` ์˜ `prerequisite` ๋กœ `main.cc` ์™ธ์—๋„ `foo.h` ์™€ `bar.h` ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ์ผ์ผํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์†Œ์Šค ํŒŒ์ผ์— ํ—ค๋” ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค Makefile ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†๋Š” ๋…ธ๋ฆ‡์ด๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ๋‹คํ–‰์ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€์„ ๋ฐ›์•„์„œ ์˜์กดํŒŒ์ผ ๋ชฉ๋ก ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— `-MD` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ์ปดํŒŒ์ผ ํ•ด๋ด…์‹œ๋‹ค. ``` $ g++ -c -MD main.cc ``` ๊ทธ๋ ‡๋‹ค๋ฉด `main.d` ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ฉด; ``` $ cat main.d main.o: main.cc /usr/include/stdc-predef.h foo.h bar.h ``` ๋†€๋ž๊ฒŒ๋„ ๋งˆ์น˜ Makefile ์˜ `target: prerequisite` ์ธ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— `-MD` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, ๋ชฉ์  ํŒŒ์ผ ๋ง๊ณ ๋„ ์ปดํŒŒ์ผ ํ•œ ์†Œ์ŠคํŒŒ์ผ์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š” ์˜์กดํŒŒ์ผ ๋ชฉ๋ก์„ ๋‹ด์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ `main.cc, foo.h, bar.h` ๊นŒ์ง€๋Š” ์ดํ•ด๊ฐ€ ๊ฐ€๋Š”๋ฐ ์™œ ์ƒ๋šฑ๋งž์€ `/usr/include/stdc-predef.h` ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํŒŒ์ผ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ `main.d` ๋ฅผ ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ์˜ Makefile ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋ƒ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main include main.d ``` ์œ„ `include main.d` ๋Š” `main.d` ๋ผ๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ Makefile ์— ํฌํ•จํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„์‹ธ๋ฆฌ ``` %.o: %.cc %.h $(CC) $(CXXFLAGS) -c $< ``` ๋ถ€๋ถ„์„ ์•„์˜ˆ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ `.d` ํŒŒ์ผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”? ๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค\! ``` CC = g++ CXXFLAGS = -Wall -O2 OBJS = foo.o bar.o main.o %.o: %.cc $(CC) $(CXXFLAGS) -c $< main : $(OBJS) $(CC) $(CXXFLAGS) $(OBJS) -o main .PHONY: clean clean: rm -f $(OBJS) main -include $(OBJS:.o=.d) ``` `$(OBJS:.o=.d)` ๋ถ€๋ถ„์€ `OBJS` ์—์„œ `.o` ๋กœ ๋๋‚˜๋Š” ๋ถ€๋ถ„์„ `.d` ๋กœ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๋ผ๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ถ€๋ถ„์€ `-include foo.d bar.d main.d` ๊ฐ€ ๋˜๊ฒ ์ฃ . ์ฐธ๊ณ ๋กœ `foo.d` ๋‚˜ `bar.d` ๊ฐ€ `include` ๋  ๋•Œ ์ด๋ฏธ ์žˆ๋Š” `%.o: %.cc` ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋ƒ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ฐ™์€ ํƒ€๊ฒŸ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ์˜์กด ํŒŒ์ผ ๋ชฉ๋ก๋“ค์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค๋ฉด ์ด๋Š” make ์— ์˜ํ•ด ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ง๋ถ™์—ฌ `include` ์—์„œ `-include` ๋กœ ๋ฐ”๊พธ์—ˆ๋Š”๋ฐ, `-include` ์˜ ๊ฒฝ์šฐ ํฌํ•จํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ make ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์— make ๋ฅผ ํ•  ๋•Œ์—๋Š” `.d` ํŒŒ์ผ๋“ค์ด ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— `include` ๊ฐ€ ์•„๋ฌด๋Ÿฐ `.d` ํŒŒ์ผ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํฌ๊ฒŒ ๋ฌธ์ œ ์—†๋Š” ๊ฒƒ์ด ์–ด์ฐจํ”ผ `.o` ํŒŒ์ผ๋“ค๋„ make ๊ฐ€ `%.o: %.cc` ๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์— make ๋ฅผ ํ•˜๊ฒŒ ๋  ๋•Œ์—๋Š” ์ œ๋Œ€๋กœ `.d` ํŒŒ์ผ๋“ค์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ``` $ tree . โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ bar.h โ”œโ”€โ”€ foo.cc โ”œโ”€โ”€ foo.h โ””โ”€โ”€ main.cc ``` ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์€ `src` ์— ๋“ค์–ด๊ฐ€๊ณ  ๋นŒ๋“œ ํŒŒ์ผ๋“ค์€ `obj` ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ข…์ข… ํ—ค๋” ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ `include` ์— ๋นผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ €๋Š” ๊ตณ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณ„๋กœ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ตณ์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์„ ์ด์œ ๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) ์•„๋ฌดํŠผ ์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋Šฅ Makefile ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ๋ณต์‚ฌํ•œ ํ›„์— `$(CC)` ์™€ `rm` ์•ž์— ์ŠคํŽ˜์ด์Šค ๋‘ ๊ฐœ๋ฅผ ๊ผญ TAB ์œผ๋กœ ์น˜ํ™˜ํ•ด์ฃผ์„ธ์š”! ์•ˆ ๊ทธ๋Ÿฌ๋ฉด make ๊ฐ€ ์ฝ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ``` CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ``` ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„๋งŒ ๊ฐ„๋‹จํžˆ ๋ถ€์—ฐ ์„ค๋ช…์„ ํ•˜์ž๋ฉด ``` # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) ``` ๋จผ์ € `SRC_DIR` ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ `SRCS` ๋กœ ์ฝ์–ด๋“ค์ด๋ ค ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. `wildcard` ๋Š” ํ•จ์ˆ˜๋กœ ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ํŒŒ์ผ๋“ค์„ ๋ฝ‘์•„๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ `foo.cc, bar.cc, main.cc` ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ `$(wildcard $(SRC_DIR)/*.cc)` ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” `./src/foo.cc ./src/bar.cc ./src/main.cc` ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” `foo.cc bar.cc main.cc` ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด `notdir` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `notdir` ์€ ์•ž์— ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์ถ”์ถœํ•ด์ค๋‹ˆ๋‹ค. ``` OBJS = $(SRCS:.cc=.o) ``` ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์—์„œ `OBJS` ๋Š” `foo.o bar.o main.o` ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด `OBJS` ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ `.o` ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ด๋“ค ํŒŒ์ผ ์ด๋ฆ„ ์•ž์— `$(OBJ_DIR)/` ์„ ๋ถ™์—ฌ์ค˜์•ผ ๊ฒ ์ง€์š”. ์ด๋ฅผ ์œ„ํ•ด์„  `patsubst` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ``` # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) ``` `patsubst` ํ•จ์ˆ˜๋Š” `$(patsubst ํŒจํ„ด,์น˜ํ™˜ ํ›„ ํ˜•ํƒœ,๋ณ€์ˆ˜)` ์˜ ๊ฐ™์€ ๊ผด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ `$(OBJS)` ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  `%.o` ํŒจํ„ด์„ `$(OBJ_DIR)/%.o` ๋กœ ์น˜ํ™˜ํ•ด๋ผ ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ๋•๋ถ„์— `OBJECTS` ์—๋Š” ์ด์ œ .`/obj/foo.o ./obj/bar.o ./obj/main.o` ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค์— ๋‚ด์šฉ์€ ์•ž์˜ ๊ธ€์„ ์ž˜ ๋”ฐ๋ผ ์˜ค์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์ž˜ ์ดํ•ด ํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ํ—ค๋” ํŒŒ์ผ๋“ค๋งŒ ๋”ฐ๋กœ ๋ฝ‘๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒ ์ฃ . ``` $ tree . โ”œโ”€โ”€ include โ”‚ย ย  โ”œโ”€โ”€ bar.h โ”‚ย ย  โ””โ”€โ”€ foo.h โ”œโ”€โ”€ Makefile โ”œโ”€โ”€ obj โ””โ”€โ”€ src โ”œโ”€โ”€ bar.cc โ”œโ”€โ”€ foo.cc โ””โ”€โ”€ main.cc ``` ์ด ๊ฒฝ์šฐ Makefile ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ``` CC = g++ # C++ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ CXXFLAGS = -Wall -O2 # ๋ง์ปค ์˜ต์…˜ LDFLAGS = # ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ INCLUDE = -Iinclude/ # ์†Œ์Šค ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ SRC_DIR = ./src # ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ OBJ_DIR = ./obj # ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ TARGET = main # Make ํ•  ์†Œ์Šค ํŒŒ์ผ๋“ค # wildcard ๋กœ SRC_DIR ์—์„œ *.cc ๋กœ ๋œ ํŒŒ์ผ๋“ค ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— # notdir ๋กœ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค. # (e.g SRCS ๋Š” foo.cc bar.cc main.cc ๊ฐ€ ๋œ๋‹ค.) SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) OBJS = $(SRCS:.cc=.o) DEPS = $(SRCS:.cc=.d) # OBJS ์•ˆ์˜ object ํŒŒ์ผ๋“ค ์ด๋ฆ„ ์•ž์— $(OBJ_DIR)/ ์„ ๋ถ™์ธ๋‹ค. OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS)) DEPS = $(OBJECTS:.o=.d) all: main $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CC) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ -MD $(LDFLAGS) $(TARGET) : $(OBJECTS) $(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) .PHONY: clean all clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) -include $(DEPS) ``` ์‚ฌ์‹ค ๊ธฐ์กด๊ณผ ๋ณ„ ์ฐจ์ด ์—†๊ณ  ๊ทธ๋ƒฅ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์— `-Iinclude/` ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ `include` ๋Š” ํ—ค๋”ํŒŒ์ผ ๊ฒฝ๋กœ ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํŒ์œผ๋กœ ๊ทธ๋ƒฅ make ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด 1 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰๋˜์–ด์„œ ์†๋„๊ฐ€ ๊ฝค๋‚˜ ๋А๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ GCC ๋‚˜ ์ปค๋„์„ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ ํ•œ ๋‘ ์‹œ๊ฐ„์€ ๊ทธ๋ƒฅ ๊ฑธ๋ฆฌ์ง€์š”. ๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด (์•„๋งˆ ๋Œ€๋ถ€๋ถ„ ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) make ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ธ์ž๋กœ `-j` ๋’ค์— ๋ช‡ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์ˆซ์ž๋ฅผ ์ ์–ด์„œ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ``` $ make -j8 ``` ์„ ํ•˜๋ฉด make ๊ฐ€ 8 ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์— ๋‚˜๋‰˜์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ make ์†๋„๊ฐ€ ์›”๋“ฑํ•˜๊ฒŒ ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ ์ฝ”์–ด ๊ฐœ์ˆ˜ + 1 ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ฝ”์–ด ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋ฆฌ๋ˆ…์Šค ํ„ฐ๋ฏธ๋„์˜ ๊ฒฝ์šฐ ``` $ make -j$(nproc) ``` ์œผ๋กœ ํ•˜๋ฉด `$(nproc)` ์ด ์•Œ์•„์„œ ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ˜„์žฌ ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ขŒ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ถ๊ธˆํ•œ ๊ฒƒ์ด๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ผญ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ๊ฐ•์ขŒ์— ๊ด€๋ จ๋œ ๊ฒƒ์ด๋ผ๋ฉด ์–ด๋– ํ•œ ๊ฒƒ๋„ ์งˆ๋ฌธํ•ด ์ฃผ์…”๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณผ ๋ฌธ์ œ๋„ ์ • ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”. ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์‹  ๊ฐ•์ขŒ๋Š” \<์”น์–ด๋จน๋Š” C++ - \<19 - 1. Make ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (Makefile ๋งŒ๋“ค๊ธฐ)\>\> ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์ขŒ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์งค ์ˆ˜์ค€๊นŒ์ง€ ๊ฐ•์ขŒ๋ฅผ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ๊ฐ•์ขŒ๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ง์•„์ฃผ์„ธ์š”
Shard138 (laksa)
Root Hash9372826391188590538
Unparsed URLcom,modoocode!/311 s443