[고급 C++]조건 컴파일 / make
- 컴퓨터공학과/Programming
- 2020. 10. 19.
조건 컴파일 |
전처리기의 이해
전처리란 원시 소스파일을 컴파일하기 전에 행해야 할 작업
특징
- 프로그램이 컴파일되기 전에 선행
- #으로 시작
- ;로 끝나면 안됨
매크로 상수
- #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 |
/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 : # 클린 레이블로 한큐에 실행 |
매크로
- 같은 파일 이름을 여러번 써야하는 경우 매크로를 사용하여 편리하고 명령으로 단순화
1 OBJS=calc.o add.o sub.o mul.o div.o # 매크로정의 |
내부매크로
- 사용자 정의 매크로 외의 미리 정의된 내부 매크로
- $@ : 현재의 목표 파일
- $* : 확장자가 없는 현재의 목표파일 이름
- $? : 현재 대상보다 최근에 변경된 필수조건 파일이름
- $< : 현재 대상보다 최근에 변경된 필수조건 파일이름(확장자 규칙 시)
1 OBJS=calc.o add.o sub.o mul.o div.o |
make의 활용
- 명시적규칙 : 컴파일에 필요한 각 처리단계와 의존성을 분명히 지정하여 make를 처리
- 암시적규칙 : make가 미리 정의된 규칙을 이용해 make파일을 단순화 시키는 규칙. 오브젝트 파일을 생성하기 위해 이들이 의존하는 파일을 찾고 컴파일러 호출까지 수행
1 OBJS=calc.o add.o sub.o mul.o div.o |
접미사 규칙
-make 파일에서 소스파일로부터 오브젝트를 만드는 과정을 작성하는 것은 매우 번거로우므로 $<사용.(**확장자규칙에서만 사용**)
1 OBJS=calc.o add.o sub.o mul.o div.o |
궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉
'컴퓨터공학과 > Programming' 카테고리의 다른 글
[고급 C++]포인터 2편(배열과 포인터) (0) | 2020.10.21 |
---|---|
[고급 C++]포인터 1편(프로세스/포인터변수/포인터연산/NULL포인터) (0) | 2020.10.20 |
[고급 C++]C컴파일러와 C라이브러리(공유/정적/동적라이브러리) (0) | 2020.10.18 |
[C++]최대공약수 구하기(3가지 방법, 유클리드 호제법) (0) | 2020.05.05 |
[C++] 누구나 쉽게, 리팩토링(클린코드)-⑤ NULL체크를 위한 널 객체 (0) | 2020.04.18 |