Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • Network
  • django
  • Kubernetes
  • 다이나믹 프로그래밍
  • BFS
  • docker
  • 백트래킹
  • boj
  • DFS
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Linux - GCC/Make
DevOps/Linux

Linux - GCC/Make

2021. 4. 22. 01:15

Linux 가상환경에서 GCC를 이용해 .C 파일을 컴파일 하는 다양한 방법을 공부해 보았다


// unix3.h
#include <stdio.h>

void printUNIX();
void printGCC();

 

// unix3-1.c
#include <stdio.h>
#include "unix3.h"

int main(){
        printUNIX();
        printGCC();

        return 0;
}
// unix3-2.c
void printUNIX(){
        printf("UNIX\n");
        return 0;
}
// unix3-3.c
void printGCC(){
        printf("GCC\n");

        return 0;
}

 

새로 만든 directory 안에 위 파일들을 만들어 준다

그리고 gcc unix3-1.c 를 입력하면

c 파일들이 헤더파일을 통해 링킹이 안됨

위와 같은 오류를 볼 수 있다

 

gcc의 다양한 옵션들


위와 같은 문제를 해결하고, c파일이 많아질 수록 일일이 컴파일 해야하는 문제가 생기기 때문에

make 명령어를 사용한다!

 

// cal.h
#include <stdio.h>

double add(double x, double y);
double minus(double x, double y);
double multi(double x, double y);
double divide(double x, double y);
// cal.h
#include <stdio.h>
#include "cal.h"

enum{
  Add=1,
  Minus,
  Multi,
  Divide,
  Exit
};

int main(){
  double val1, val2;
  int select;
  double result;
  while(1){
    printf("Enter val1, val2 : ");
    scanf("%lf %lf", &val1, &val2);
    printf("Enter calculate mode (1:Add, 2:Minus, 3:Multi, 4:Divide, 5:Exit)\n");
    scanf("%d", &select);

    switch(select){
      case Add:
        result = add(val1, val2);
        break;
      case Minus:
        result = minus(val1, val2);
        break;
      case Multi:
        result = multi(val1, val2);
        break;
      case Divide:
        result = divide(val1, val2);
        break;
      case Exit:
        return 0;
      default:
        printf("input right number ㅡ.ㅡ\n");
        break;
    }
    printf("result value : %lf\n", result);
  }
  return 0;
}
// add.c
#include <stdio.h>

double add(double x, double y){
        return x + y;
}
// minus.c
#include <stdio.h>

double minus(double x, double y){
        return x - y;
}
// multi.c
#include <stdio.h>

double multi(double x, double y){
        return x*y;
}
// divide.c
#include <stdio.h>

double divide(double x, double y){
        return x/y;
}

 

ex) 간단한 계산기 프로그램

  • calculate.c <- 값을 입력 받는 파일
  • calculate.h <- calculate.c가 참조해야할 함수들의 정보가 들어있음
  • add.c  minus.c  multi.c  divide.c <- 연산을 수행하는 함수

1. gcc 명령어를 사용한 빌드 cal1

gcc -o 명령어를 이용해서 모든 c파일을 링킹하고 컴파일 해주었다..

 

c파일이 수십개가 되었을 때 저렇게 하나하나 링킹해서 컴파일하는 상상을 하니 숨이 막힌다

그래서 이때 Makefile을 이용하면 편하게 작업을 할 수 있다

 

 

2. Makefile 을 이용한 빌드 cal2

 

mkdir Makefile 입력해서 Makefile 을 만들어준다

Makefile 구성

매크로 정리

CC = gcc C 컴파일러를 gcc컴파일러로 설정함 default : CC
CFLAGS = -g gcc의 옵션을 세팅함 -> gcc -g
TARGET = cal2 목표의 이름을 cal2로 설정
OBJECTS = cal.o add.o minus.o multi.o divide.o 목표와 의존 관계에 있는 파일들을 지정
$(TARGET): $(OBJECTS)  의존 관계부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 아래에 정의된 것들이 차례대로 실행됨
$(CC) -o $(OBJECTS) gcc -o cal.o add.o minus.o multi.o divide.o 를 실행한다고 보면 됨
clean: rm-rf *.o $(TARGET) make clean 을 실행하면 rm(지운다) -rf(재귀적으로 강제로) *.o(.o로 끝나는 모든 파일들과 TARGET을)

위와 같이 잘 만들어지는 것을 볼 수 있다!

 

운영체제에서 실습중인 XV6 OS도 make를 통해서 실행시키기 때문에 

gcc를 공부함으로써 운영체제의 실행에 대한 이해도 높아진 것 같다! 

 

시간이 된다면 지금까지 배운 리눅스 명령어와 gcc를 활용해서 XV6를 내 맘대로 바꿔보고싶긴하다..

'DevOps > Linux' 카테고리의 다른 글

[Linux] 웹사이트 동작 체크 명령어는?  (0) 2022.04.10
[Linux] 리눅스 서버 접속 방법과 도구(ubuntu)  (0) 2022.03.31
Ubuntu IP 설정하기 (Virtual Box)  (0) 2022.03.13
    'DevOps/Linux' 카테고리의 다른 글
    • [Linux] 웹사이트 동작 체크 명령어는?
    • [Linux] 리눅스 서버 접속 방법과 도구(ubuntu)
    • Ubuntu IP 설정하기 (Virtual Box)

    티스토리툴바