[ Make & Makefile ] C/C++ 빌드해보기

DPOS·2021년 6월 28일
2

LinuxSoftware

목록 보기
1/1
post-thumbnail

  예전에 같이 연구하시던 교수님이 항상 기록하고 기록하라는 말을 해주셨습니다.
머리로만 기억하려하면 잊어도 뭘 잊었는지 모른다고 하신 말이 최근에 체감이 되서 배우는 것 하나하나 벨로그에 기록해 나갈 예정입니다.

1. 기본적인 개념 서술

1) Make가 무엇이고 왜 사용하는가?

Makefile 얘기를 꺼내기 전에 먼저 Make라는 소프트웨어를 설명하겠습니다.

  먼저, make라는 소프트웨어는 unix/linux환경에서 주로 사용되는 프로그램을 빌드할 수 있는 도구입니다. 터미널에서 make라고 입력하면 사용할 수 있는 소프트웨어죠.

  그렇다면 "그냥 컴파일러를 사용하지 않고, 왜 make를 사용하는가?"하는 의문이 생길 수 있는데 그 이유는 다음과 같습니다.

  • Source file과 Header file이 많을 경우 각각 컴파일하지 않고, 쉽고 빠르게 처리할 수 있다.
  • 프로그램 종속성의 구조를 파악하기 쉬워 파일관리에 용이하다.
  • 프로그래밍은 한번하고 끝이 아닌 지속적인 패치가 이루어지기 때문에 유지보수하기에 좋다.

2) Makefile은 무엇인가?

  Makefilemake에게 어떻게 컴파일할지, 어떤 명령을 수행할 것인지 알려주는 파일로 make를 실행하기 위해서는 디렉토리 안에 Makefile이 있어야 합니다. 추가로 CMake를 통해 Makefile을 생성할 수 있는데 개발자가 의존성 정보를 잘못 기술하여 빌드가 꼬이는 것을 막아주기 위해 나온 프로그램입니다.


2. 사용방법

1) 파일구성하기

빌드할 소스코드와 헤더파일을 구성해봅시다.

    1. 사용할 헤더와 함수를 미리 정의해 놓은 헤더파일
    1. 함수가 정의 되어 있는 소스파일
    1. main이 있는 소스파일

이렇게 3가지 파일로 구성된 실행파일을 만들어볼건데 각 파일의 코드는 다음과 같습니다.

  • header.h
#include <stdio.h>
void print();
  • func.c
#include "header.h"

int add(int a, int b)
{
    return a+b;
}
int sub(int a, int b)
{
    return a-b;
}
void print(int a, int b)
{
    printf("add() res : %d\nsub() res : %d", add(a,b), sub(a,b));
}
  • main.c
#include "header.h"

int main()
{
    int a = 5, b = 3;
    print(a, b);
    return 0;
}

2) 컴파일 해보기

파일구성이 끝났다면 Makefile을 작성하고, 컴파일해보도록하겠습니다.

Makefile은 크게 다음 4가지로 구성됩니다.

  • 매크로 (Macro)
  • 대상 (Target)
  • 의존성 (Dependency)
  • 명령어 (Recipe)

(독자를 위해터미널 폰트 크기도 키우고 주석까지 달아주는 친절함)

위 구성에선 제외되었지만,

EXE : function.o main.o
	gcc -o EXE function.o main.o

이 코드가 매크로 바로아래에 추가되어야합니다. 그리고 이것들의 구성을 살펴보면 다음과 같습니다.

  • Macro : 자주 사용하는 문자열을 담는 변수라고 보면 좋을까요..?
    자주 사용할 문자를 명명해주는데 C나 C++에서 전처리하는 부분이라 생각하면 될 것 같네요!
  • Tartget : 컴파일을 통해 만들어질 (목적)파일을 말합니다.
  • Dependency : 타겟부분을 컴파일하는데 사용되는 재료라고 보면 될 것 같습니다.
  • Recipe : 실질적으로 컴파일 시키는 부분으로 실행하려는 명령어를 적어주면 됩니다.

Makefile도 다 쓴 김에 이제 진짜 컴파일 해보도록 합시다.

  터미널을 키고 make를 입력하시면 Makefile의 내용에 따라 컴파일되고, 순서대로 목적파일과 실행파일이 만들어집니다.

  근데 이대로 끝내기엔 뭔가 부족한거 같죠 ㅇㅅㅇ? 네, 아직 phony target에 대한 설명을 하지 않았는데 이는 직역하면 가짜 타겟이라는 뜻으로 위치는 타겟의 위치에 있지만 컴파일할 파일이 아닙니다. 그럼 어디에 쓰는건지 알아보도록 합시다.


 이렇게 씁니다. 위에서 clean이라는 가짜 타겟을 지정해줬었죠 ㅇㅅㅇ? 그 친구를 make 뒤에 붙여서 명령줄을 실행하면, 다음과 같이 clean의 recipe로 적어줬던 rm *.o EXE가 실행됩니다. 즉, 사용할 명령어를 이름을 붙여서 필요할때 간단하게 호출하여 사용할때 사용합니다!

✅ 정리

  1. Target, Dependency, Recipe를 통한 Makefile구성 (최종적으로 컴파일할 내용이 위쪽으로)
  2. 자주 사용하는 옵션이나 단어 매크로를 통한 정리
  3. 필요에 따라 Phony target설정
profile
본인 전공빼고 다 하는 사람

0개의 댓글