๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- linux, aws, docker, k8s

[๋ฆฌ๋ˆ…์Šค] gcc ๋กœ c ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผํ•˜๊ธฐ (ํ—ค๋” ํŒŒ์ผ๋กœ ๋‚˜๋ˆ ์„œ ์ปดํŒŒ์ผํ•˜๊ธฐ)

by Wonit 2021. 7. 16.

 

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ 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) => ์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”!

๋Œ“๊ธ€