[리λ μ€] gcc λ‘ c μΈμ΄λ‘ μμ±λ μμ€ μ½λ μ»΄νμΌνκΈ° (ν€λ νμΌλ‘ λλ μ μ»΄νμΌνκΈ°)
μ°λ¦¬κ° μΌλ°μ μΌλ‘ c μΈμ΄λ₯Ό μ»΄νμΌνκΈ° μν΄μλ Visual Studioλ CLion μ μ΄μ©ν΄μ Run νΉμ Debugging μ νμμλ€.
νμ§λ§ 리λ μ€ νκ²½μμλ Visual Studio λ CLion μ μ€μΉνκΈ°λ λ§€μ° κΉλ€λ‘κ³ QT-Creator κ³Ό κ°μ νλ‘κ·Έλ¨μ μ΄μ©ν΄μΌ νλ€.
μ΄λ κ² IDEλ₯Ό μ¬μ©νλ λ°©λ²μ΄ μ λ μλλ κ²μ μλμ§λ§, κ·Έκ²λ³΄λ€ ν°λ―Έλμμ g++μ΄λ gcc λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ μ»΄νμΌνλ νΈμ΄ μ€νλ € λ νΈν λκ° μλ€.
μ€λμ ν°λ―Έλμμ gcc λ‘ c μΈμ΄λ₯Ό μ»΄νμΌνκ³ object νμΌμ λ§λλ κ²μ λν΄μ μμλ³Ό κ²μ΄λ€.
리λ μ€μμ c μΈμ΄ μ»΄νμΌνκΈ°
μ°μ gcc λ g++ μ μ€μΉν΄μΌ νλ―λ‘ λ€μκ³Ό κ°μ΄ aptλ₯Ό ν΅ν΄μ g++, gcc λ₯Ό μ€μΉν΄μ£Όμ. apt-get μ μ¬μ©ν΄λ 무방νλ€
gccλ g++ μ€μΉνκΈ°
$ sudo apt update
$ sudo apt install -y g++
$ sudo apt install -y gcc
$ sudo apt install -y vim
κ·Έλ¦¬κ³ μμ£Ό κ°λ¨ν μμ€μ½λλ₯Ό μμ±ν΄λ³΄μ
c κ°λ¨ν μΆλ ₯ νλ‘κ·Έλ¨ λ§λ€κΈ°
κ°λ¨νκ² printf()
λ₯Ό μ΄μ©ν΄μ μΆλ ₯μ νλ νλ‘κ·Έλ¨μ λ§λ€κ³ μ€νμμΌλ³΄λλ‘ νμ.
μ°μ vim μ μ΄μ©ν΄μ main.c μ κ°λ¨ν μΆλ ₯ ν¨μλ₯Ό μμ±ν΄λ³΄μ.
$ vim main.c
#include <stdio.h>
int main() {
printf("(main.c executed...) => gcc λ‘ c μΈμ΄ μ»΄νμΌνκΈ°λ λ§€μ° μ½λ€μ");
return 0;
}
gcc λ₯Ό μ΄μ©ν΄μ μ»΄νμΌνκΈ°
gcc λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ μ»΄νμΌμ ν΄λ³΄μ
κ°λ¨νλ€. gcc [μμ€νμΌ]
μ ννλ‘ μμ±ν΄μ£Όλ©΄ default λ‘ a.out
μ΄λΌλ νμΌμ΄ μμ±λ κ²μ΄λ€.
$ gcc main.c
κ·ΈλΌ ls λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ λλ ν 리 λ΄λΆ νμΌμ νμΈν΄λ³΄λ©΄, ν΄λΉ λλ ν 리 μλμ a.out νμΌμ΄ μμ±λλ€.
./a.out
μ μ΄μ©ν΄μ out νμΌμ μ€νμν¬ μ μλ€
$ ls
a.out main.c
$ ./a.out
(main.c executed...) => gcc λ‘ c μΈμ΄ μ»΄νμΌνκΈ°λ λ§€μ° μ½λ€μ
μ΄λ κ² κ°λ¨νκ² gccλ₯Ό μ΄μ©ν΄μ out νμΌμ λ§λ€κ³ μ»΄νμΌνλ λ°©λ²μ λν΄μ μμ보μλ€.
μ΄λ²μλ λ§νΉμ μ΄μ©ν΄μ μ¬λ¬ μμ€μ½λλ₯Ό λ¬Άμ΄λ³΄λ μμ μ ν΄λ³΄μ
header νμΌλ‘ λλμ΄μ§ μμ€ μ½λ λ§νΉνμ¬ μ»΄νμΌ νκΈ°
μ΄μ μ‘°κΈ λ λμκ°μ ν€λνμΌμ include νλ main ν¨μλ₯Ό μμ±νκ³ μ΄λ₯Ό μ»΄νμΌν΄λ³΄μ
$ tree
.
βββ src
βββ main.c
βββ hello.h
βββ hello.c
βββ bye.h
βββ bye.c
λ‘ κ΅¬μ±λ κ²μΈλ°, μ°μ ν€λ νμΌκ³Ό ν¨κ» μ»΄νμΌμ νκΈ° μν΄μλ λ§νΉμ λν΄μ μμμΌ νλ€.
λ§νΉ (Linking) μ΄λ?
μ°λ¦¬κ° μμ κ°μ ꡬ쑰μμ main.c κ° hello.h μ bye.h λ₯Ό include ν΄μ μ¬μ©νκ³ Greeting μ΄λΌλ νλ‘κ·Έλ¨μ λ§λ λ€κ³ κ°μ ν΄λ³΄μ.
κ·ΈλΌ main.c μμλ μ€μ§μ μΌλ‘ hello.h μ bye.h λ₯Ό λ‘λν κΉ?
μλλ€. μ΄μ λΈλ¦¬ μ½λλ₯Ό λ³Έλ€λ©΄ main.c μμλ hello.h μμ κ°μ Έμ¨ ν¨μκ° μ΄λμ μμΉν΄ μλ€λ κ²λ§ μ°μ°νλ€.
κ·Έλμ main.c λ₯Ό μ λλ‘ λμμν€κΈ° μν΄μλ
hello.hμ bye.h λ₯Ό νλλ‘ ν©μΉλ κ³Όμ§μΈ Linkingμ΄ νμνκ² λλ€
λ§νΉμ μλ‘ λ€λ₯Έ νμΌμ ν©μ΄μ§ ν¨μλ ν΄λμ€λ₯Ό ν λ° λ¬Άμ΄μ λ§ν¬ν΄μ£Όλ μμ μ λ»νλλ°, λ§νΉ κ³Όμ μ μ»΄νμΌλ¬μκ² Object νμΌμ ν¨κ» μ λ¬νλ©΄μ μ»΄νμΌμ νκ² λλ€.
μ»΄νμΌκ³Ό λ§νΉμ ν΅ν΄μ Greeting νλ‘κ·Έλ¨ λ§λ€κΈ°
μ! μ΄μ μ°λ¦¬κ° μκ°ν μμ€ μ½λλ€μ ꡬννκ³ μ΄λ€μ λ§νΉνμ¬ μ»΄νμΌ ν΄λ³΄λλ‘ νμ
main ν¨μμ κ°κ° header νμΌ μμ± λ° κ΅¬ν
main ν¨μ μμ± λ° κ΅¬ννκΈ°
#include <stdio.h>
#include "hello.h"
int main() {
say_hello();
say_bye();
return 0;
}
header νμΌ μμ± λ° κ΅¬ννκΈ°
// hello.h
void say_hello():
// hello.c
#include <stdio.h>
#include "hello.h"
void say_hello() {
printf("(hello.h) => μλ
νμΈμ! \n");
}
// bye.c
#include <stdio.h>
#include "bye.h"
void say_bye() {
printf("(bye.h) => μλ
ν κ°μΈμ! \n");
}
object νμΌλ‘ λ§λ€μ΄μ λ§νΉ(Linking) νκΈ°
λ§νΉ μ»΄νμΌμ μν΄μλ λ°λ‘ μ»΄νμΌμ νλ κ²μ΄ μλκ³ , μ»΄νμΌλ¬μκ² μ°κ΄λ (λ§ν¬ ν ) νμΌλ€μ Object νμΌλ‘ ν¨κΌ μ λ¬ν΄μΌ νλ―λ‘ κ°κ° object νμΌλ‘ λ§λλ κ³Όμ μ μνν΄λ³΄μ
gcc λͺ
λ Ήμ -c
μ΅μ
μ μ€λ€λ©΄ μ£Όμ΄μ§λ νμΌμ μ»΄νμΌν΄μ λͺ©μ νμΌ(Object file) μ λ§λ€λΌλ λͺ
λ Ήμ ν μ μλ€.
$ gcc -c main.c
$ gcc -c hello.c
$ gcc -c bye.c
$ gcc main.o hello.o bye.o -o Greeting
κ·Έλ¦¬κ³ ls λͺ λ Ήμ ν΅ν΄μ μ μ»΄νμΌμ΄ μλ£λμλμ§ νμΈνκΈ° μν΄ ls λͺ λ Ήμ μνν΄λ³΄μ
$ ls
main.c main.o hello.h hello.c hello.o bye.h bye.c bye.o Greeting
κ·ΈλΌ μ°λ¦¬κ° μμ±νκΈ°λ‘ ν Greeting νμΌμ΄ μ λ§λ€μ΄μ§ κ²μ λ³Ό μ μλ€.
μ€νμμΌλ³΄μ!
$ ./Greeting
(hello.h) => μλ
νμΈμ!
(bye.h) => μλ
ν κ°μΈμ!