🀷🏼‍♀️ Etc.../- linux, aws, docker, k8s

[λ¦¬λˆ…μŠ€] gcc 둜 c μ–Έμ–΄λ‘œ μž‘μ„±λœ μ†ŒμŠ€ μ½”λ“œ μ»΄νŒŒμΌν•˜κΈ° (헀더 파일둜 λ‚˜λˆ μ„œ μ»΄νŒŒμΌν•˜κΈ°)

Wonit 2021. 7. 16. 15:00

 

μš°λ¦¬κ°€ 일반적으둜 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) => μ•ˆλ…•νžˆ κ°€μ„Έμš”!