[고급 C++]조건 컴파일 / make

  조건 컴파일

전처리기의 이해

전처리란 원시 소스파일을 컴파일하기 전에 행해야 할 작업

 

특징

- 프로그램이 컴파일되기 전에 선행

- #으로 시작

- ;로 끝나면 안됨

 

매크로 상수

- #define 문을 이용하여 정의하는 상수

- 프로그램 전체에서 텍스트 대치를 선행처리기에게 알림

- 일련의 문자들이 다른 문자로 대치되는 매크로 대치 과정

 

조건컴파일

- 프로그램 코드의 일부가 선택적으로 컴파일될 수 있게함

- 지시자 : #if #elif, ,#else, #endif, #ifdef, #ifndef

- 헤더파일의 중복 문제

#ifndef _POINT_H_
#define _POINT_H_

struct Point
{
	int x, y;
} pos;

#endif

 

※ 시스템 헤더파일은 한번만 정의되도록 설계

vi /usr/include/stdio.h

     3  #ifndef _STDIO_INCLUDED

     4  #define _STDIO_INCLUDED

 997  #endif /* _STDIO_INCLUDED */

 

※  #define, typedef 선언의 중복

다중 include가 발생했을 때

#define 정의

- 같은 단어에 대해 같은 정의를 내리는 경우 오류

- 같은 단어에 대해 다른 정의를 내리는 경우 경고오류, 나중에 정의된된 뜻사용

#typedef 정의

- 같은 자료형에 대해 중복된 정의를 내리는 경우 무조건 오류 처리

 

 

 

  make

분할 컴파일

소스코드가 실행파일이 되기 위해서는 각 모듈별로 컴파일이 이루어지고, 관련이 있는 목적파일들과 라이브러리를 링크하는데 이 때 여러파일로 나누어 작업하는 컴파일을 분할 컴파일이라 함

 

장점

- 기능단위의 개발이 가능해짐

- 모듈별 테스트 및 디버깅 가능

- 필요에 따라 소스코드는 숨기고 모듈만 제공 가능

- 프로그램을 수정한 경우 따로 컴파일 가능

- 모듈의 재사용성과 프로그램의 가독성을 높임

 

 

 

make

특징

- 파일관리 유틸리티

- 복잡한 컴파일 작업을 자동화하는 프로그래밍 언어

 

실행

make [-f makeFileName]

* makefile : 어떤 작업을 수행해야하는지 make에 알려줄 정보를 담고있는 파일

 

문법

대상리스트 : 의존성리스트
[TAB] 명령리스트


- 의존성 : 대상을 생성하는데 필요한 소스 파일의 관계
- 대상 : make가 궁극적으로 생성하는 것으로 명령이 수행되어 나온 결과 파일(목적파일이나 실행파일)

- 명령 : 대부분 컴파일러 호출, 대상이 의존하는 파일 중 변경된 파일이 있거나 대상이 존재하지 않을 때 실행

- 주석 : #

 

예시

     1  calc : add.o sub.o mul.o div.o calc.o
     2     cc -o calc add.o sub.o mul.o div.o calc.o
     3  add.o : add.c
     4     cc -c add.c
     5  sub.o : sub.c
     6     cc -c sub.c
     7  mul.o : mul.c
     8     cc -c mul.c
     9  div.o : div.c
    10     cc -c div.c
    11  calc.o : calc.c
    12     cc -c calc.c

/data/it/it03]make

        cc -c add.c

        cc -c sub.c

        cc -c mul.c

        cc -c div.c

        cc -c calc.c

        cc -o calc add.o sub.o mul.o div.o calc.

 

레이블 대상

- 사용자가 원할 때 make가 특정 명령을 실행하기 위한 것

    13  clean :    # 클린 레이블로 한큐에 실행
    14     rm clac calc.o add.o sub.o mul.o div.o

 

매크로

- 같은 파일 이름을 여러번 써야하는 경우 매크로를 사용하여 편리하고 명령으로 단순화

     1  OBJS=calc.o add.o sub.o mul.o div.o    # 매크로정의
     2  calc : $(OBJS)  # 매크로사용
     3     cc -o calc $(OBJS)
     4  add.o : add.c
     5     cc -c add.c
     6  sub.o : sub.c
     7     cc -c sub.c
     8  mul.o : mul.c
     9     cc -c mul.c
    10  div.o : div.c
    11     cc -c div.c
    12  calc.o : calc.c
    13     cc -c calc.c
    14  clean :
    15     rm calc $(OBJS)

 

내부매크로

- 사용자 정의 매크로 외의 미리 정의된 내부 매크로

- $@ : 현재의 목표 파일

- $* : 확장자가 없는 현재의 목표파일 이름

- $? : 현재 대상보다 최근에 변경된 필수조건 파일이름

- $< : 현재 대상보다 최근에 변경된 필수조건 파일이름(확장자 규칙 시)

     1  OBJS=calc.o add.o sub.o mul.o div.o
     2  calc : $(OBJS)
     3     cc -o $@ $(OBJS)
     4  add.o : add.c
     5     cc -c $*.c
     6  sub.o : sub.c
     7     cc -c $*.c
     8  mul.o : mul.c
     9     cc -c $*.c
    10  div.o : div.c
    11     cc -c $*.c
    12  calc.o : calc.c 
    13     cc -c $?
    14  clean :
    15     rm calc $(OBJS)

 

make의 활용

- 명시적규칙 : 컴파일에 필요한 각 처리단계와 의존성을 분명히 지정하여 make를 처리

- 암시적규칙 : make가 미리 정의된 규칙을 이용해 make파일을 단순화 시키는 규칙. 오브젝트 파일을 생성하기 위해 이들이 의존하는 파일을 찾고 컴파일러 호출까지 수행

     1  OBJS=calc.o add.o sub.o mul.o div.o
     2  calc : $(OBJS)
     3     cc -o $@ $(OBJS)
     4  clean :
     5     rm calc $(OBJS)

 

접미사 규칙

-make 파일에서 소스파일로부터 오브젝트를 만드는 과정을 작성하는 것은 매우 번거로우므로  $<사용.(**확장자규칙에서만 사용**)

 

     1  OBJS=calc.o add.o sub.o mul.o div.o
     2  calc : $(OBJS)
     3     cc -o $@ $(OBJS)
     4  .c.o :
     5     cc -c $<
     6  clean :
     7     rm calc $(OBJS)

 


 

 

 

 

궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️