ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개...

39
2006 System Programming ch00: 프로그램 개발 도구 소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터 네트워크 연구실 [email protected] Rm: 1228, Tel: 580-5234

Transcript of ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개...

Page 1: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

2006 System Programming

ch00: 프로그램 개발 도구 소개GCC, GDB, vi, Make

주 홍 택계명대학교, 정보통신대학

컴퓨터 네트워크 연구실

[email protected]

Rm: 1228, Tel: 580-5234

Page 2: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

내용

GCC

GDB

vi

Make

Page 3: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

C 프로그램 컴파일하기

위 과정은 gcc 명령어 호출로 실행됨

전처리기(preprocessor)

컴파일러(compiler)

어셈블러(assembler)

링커(linker)

.c

.s

.s

.o

.o

a.out

Page 4: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

컴파일 과정

전처리(preprocessing) #define, #include, #if와 같은 전처리 지시자 해석 전처리 작업을 위한 cpp 프로그램을 호출

컴파일(compile) 고급 언어 소스 프로그램을 입력 받아서 어셈블리 파일을 만듬(.s) 일반적으로 어셈블리 파일은 저장하지 않고 바로 어셈블러를 호출함 여기서 컴파일은 좁은 의미의 컴파일이며 넓은 의미의 컴파일은 모든

과정을 포함함

어셈블(assemble) 어셈블리 파일을 입력 받아서 오브젝트 파일을 만듬(.o) 어셈블을 위한 gas 프로그램을 호출함 어셈블러는 플랫폼(CPU+OS)마다 다르며 해당 전용 어셈블러 호출

가능

링크(linking) 오브젝트 파일을 엮어서 실행 파일을 만듬(.o) 라이브러리 함수도 이 단계에서 사용함 링크를 위한 ld 프로그램을 호출

Page 5: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

gcc 사용법

모든 컴파일 과정을 한번에 처리하기$ gcc –o filter filter_driver.c define_stack.c

-o 옵션은 실행 파일 명을 지정함 이 옵션을 지정하지 않으면 a.out이 실행 파일임

필요한 소스 파일만 컴파일 하기$ gcc –c filter_driver.c

$ gcc –c define_stack.c

$ gcc –o filter filter_driver.o define_stack.o

-c 옵션은 컴파일하지만 링크는 하지 않음(.o) 파일 만 만듬 이후에 define_stack.c가 변경되었다면 2,3번만 수행 filter_driver는 컴파일 하지 않음 소스 코드가 매우 많은 파일로 분리되어 있는 경우에 상당히

효과적임

Page 6: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

매크로 정의하기

컴파일러 매크로 컴파일러가 파일을 제어할때 사용하는 정보

-D 옵션을 사용한 매크로 정의$ gcc –c –DDOC_FILE=“info” –DUSE_POLL filter_driver.c

-D 옵션은 매크로를 정의함

-DDOC_FILE은 소스에서 #define DOC_FILE info와 동일한결과

-DUSE_POLL은 소스에서 #define USE_POLL과 동일함 효과(기본값 1로 정의됨)

-U 옵션은 매크로 정의를 해제함 #undef와 동일한 효과임

-I 옵션은 헤더 파일 위치 지정$ gcc–I../headers filter_driver.c

비표준 라이브러리를 위한 헤더 파일의 디렉토리를 지정

Page 7: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

라이브러리와 링크하기

-l 옵션은 라이브러리 지정$ gcc –o plot main.o plot_line.o –lm

-lm은 수학 라이브러리를 포함한다는 의미임

표준 라이브러리를 담고 있는 디렉토리에서 libm.a을 찾음

라이브러리의 상대적 위치 순서대로 함수를 찾음

시스템 호출 라이브러리, 입출력 라이브러리, 실행 초기루틴은 기본적으로 포함됨

-L 옵션은 비표준 라이브러리 지정$ gcc –o plot –L/usr/local/lib main.o plot_line.o –lx

표준 라이브러리가 아니 비 표준 라이브러리 사용

표준 라이브러리가 이곳에 있으면 우선적으로 사용

Page 8: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

중간 결과 파일

중간 결과 파일의 생성 목적 디버깅

코드를 직접 다루기 위하여 (device driver 등)

전처리 -E 옵션으로 생성되며 표준 출력으로 내보냄

컴파일 -S 옵션으로 생성되며 .s 확장자로 된 파일에 출력

어셈블 -o 옵션으로 생성되며 .o 확장자로 된 파일에 출력

Page 9: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

컴파일러 옵션: 디버깅과 프로파일링

컴파일할때 디버깅을 위한 코드와 심볼 테이블을 삽입함

Dbx, gdb, prof, gprof과 같은 프로그램에서 사용 가능한코드를 생성함

개발 완료시 이 기능을 사용하지 않음

옵션 p

prof에서 프로파일링 할 수 있는 프로그램 생성

옵션 pg

gprof에서 프로파일링 할 수 있는 프로그램 생성

옵션 g

디버거 gdb에서 쓸 수 있는 확장된 심볼 테이블 을 생성

Page 10: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

라이브러리 만들기

Ar 명령으로 오브젝트 모듈의 라이브러리 만듬

새로운 라이브러리 생성 $ ar rs libname list-of-files

r 옵션: 파일을 추가하고 없으면 새로운 라이브러리 생성

s 옵션: 정적 라이브러리 색인 생성(ranlib 불필요)

라이브러리 갱신 $ ar rus libname list-of-files

라이브러리의 모듈과 파일의 날짜를 비교하여 갱신

라이브러리에서 파일 지우기 $ ar ds libname list-of-files

라이브러리에서 파일 추출 $ ar x libname list-of-files

Page 11: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

디버깅이란

디버깅 프로그램의 논리적인 오류를 찾아내는 과정

프로그램 수행 중에 내부적인 동작을 파악

프로그램 수행 중 오류 발생으로 중단된 원인 파악

C/C++ 디버깅 도구인 GDB 디버거 소개 프로그램을 수행하거나 정지 시킬 수 있음

수행 도중 변수 값을 알아 볼 수 있고 프로그램 수행 과정을 추적

프로그램 수행 속도가 늦어 질 수 있음

Page 12: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

디버깅을 위한 컴파일

GDB를 사용하려면 반드시 gcc 컴파일러에서 –g 옵션을주어야함gcc –g file1.c file2.c file3.o

file1.c file2.c는 소스 레벨의 디버깅 가능

file3.o는 오브젝트 파일을 만들 때 –g로 컴파일 한 경우에 한해서 소스 레벨의 디버깅 가능

최적화 옵션 –O와 동시에 사용 가능

최적화는 실행 프로그램에 변동을 가져옴

예: 변수 또는 코드가 사라 질 수 있음

추천: 최적화 없이 우선 완전하게 동작하는 프로그램 개발 후최적화 적용

최적화 사용시 프로그램이 비정상적으로 동작할 수 있음을 명심

Page 13: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 시작하기

gdb 명령으로 시작 gdb ex-prog core-dump

실행 파일, ex-prog,를 디버깅

프로그램 오류에 의하여 중단된 프로세스의 덤프 파일, core-dump,를 디버깅

gdb 옵션들-d dir : 소스 파일이 있는 디렉토리 지정

-x file : gdb 시작 후 file에 있는 gdb 명령어 우선 실행

-c number : 실행 중인 프로세스의 pid가 number인 프로세스를 디버깅

-batch : -x file로 지정된 gdb 명령 수행 후 gdb 종료

gdb 종료 명령어 모드에서 quit 또는 q

Page 14: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

Gdb 명령어 기본

gdb 몇 개만 사용해도 디버깅을 잘 할 수 있음

프로그램을 수행하고 정지 시키고 그리고 변수값을 알아 보는 일이 대부분임

명령어를 잘 모른 다면 help 명령어 사용

명령어 입력 중 TAB 키을 사용하면 가능한 입력나열 만약 가능한 입력이 하나 밖에 없으면 자동으로 명령어

를 확장해 줌

Page 15: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 파일 내용 출력

list 명령어는 실행하고 있는 부분의 소스를 출력(gdb) list

프로그램 실행 전에는 main 함수의 내용을 보여 줌

특정 부분을 보려면 소스 프로그램의 줄 번호를 입력함(gdb) list 90

또는 특정 함수의 소스 코드를 보려면 함수의 이름 입력(gdb) list badfunc

Page 16: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 프로그램 실행

run 명령어: 디버그 할 프로그램 수행 프로그램에 전달 할 인자 지정 가능(gdb) run –b < invalues > outtable

다음 run 명령어에서 인자를 주지 않으면 이전의 인자 그대로 사용

set arg 명령을 사용하여 인자를 바꾸거나 설정할 수있음(gdb) set args –b < invalues > outtable

Show args로 설정된 인자를 알아 볼 수 있음(gdb) show args

Page 17: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 프로그램 정지

break 명령어로 프로그램 정지 지점 설정(gdb) break line-number

소스의 특정 위치인 주어진 줄, line-number에 오면 프로그램정지

(gdb) break func-name

소스의 특정 함수, func-name에 오면 프로그램 중지(gdb) break line-or-func if condition

소스의 특정 위치에서 조전, condition을 만족하면 프로그램정지

watch 명령어로 특정 조건을 만족하면 프로그램 정지(gdb) watch condition

프로그램의 속도가 상당히 느려짐 일반적으로 watch를 사용하여 프로그램 오류을 대략적인 위치

를 알아내고 break를 사용하여 정확한 위치를 추적함

Page 18: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 프로그램 상태 파악

프로그램을 정지시켜 놓고 상태를 파악하여 오류를 알아냄 whatis 명령어로 변수의 타입을 알아 봄(gdb) whatis variable

print 명령어로 변수의 값을 알아 봄(gdb) print variable

고급 print 명령어 Print 명령어의 variable은 C 언어의 구문을 그대로 사용할 수 있음(gdb) print a->member

함수의 결과 값도 함수를 호출하여 알아 볼 수 있음(gdb) print function(args,…)

전역 변수가 변경 될 수 있음

@을 사용하여 배열의 길이를 지정할 수 있음(gdb) print *p@10

::를 사용하여 범위(scope)를 지정할 수 있음(gdb) print func::var-x

/x,u,o,c,etc 를 사용하여 출력 형태를 지정할 수 있음(gdb) print/x var-x

where 명령어를 사용하여 프로그램의 호출 상태 파악하기 call stack의 위 아래로 up, down 명령어를 사용하여 이동 가능

Page 19: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 정지점 관리

복수개의 정지점 설정 가능

정지점은 info breakpoints 를 사용하여 설정된정지점 알아 볼 수 있음

delete break-number 명령을 사용하여 정지점제거 가능 인자를 주지 않으면 모든 정지점 지움

disable, enable을 사용하여 정지점을 잠시 유효및 무효화 시킬 수 있음

Page 20: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 계속 실행

continue 명령어를 사용하여 프로그램 계속 수행가능

step 명령어를 통해서 한 줄씩 수행 가능 함수를 만나면 함수로 들어 가서 한 줄 수행

next 명령어를 통해서 한 줄씩 수행 가능 함수도 한 줄로 인식하여 함수 안으로 들어가지 않음

finish 현재 실행 중인 함수의 끝까지 실행하고멈춤

return value 은 현재 실행 중인 함수를 취소하고value를 리턴 값으로 사용함

Page 21: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

GDB 명령어: 시그널 설정

Handle 명령어를 사용하여 디버깅 프로그램에 보내는 시그널 제어(gdb) handle signal action-list

signal은 SIGINT와 같은 시스템에서 정한 시그널 Action-list는 다음과 같은 의미를 가짐

nostop: 시그널을 받았을 때 프로그램에 넘겨주지 않고 정지 시키지도 않음

stop: 시그널을 받았을 때 프로그램을 정지 시키고 디버그 모드로전환

print: 시그널을 받았을 때 메시지 출력 pass: 프로그램에 시그널을 넘겨 줌 nopass: 프로그램에 시그널을 넘겨주지 않음

(gdb) handle SIGINT stop print

Singal 명령을 통하여 프로그램에 시그널 발생(gdb) signal 2

Page 22: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

vi 편집기

오랜역사와 다양한 기능을 가진 편집기

현재 vi 의 개선된 버전인 VIM(VI Improved)를 사용

vi --help 다양한 실행옵션

넓은화면을 사용하기 위해 메뉴가 없으며 숨겨진기능들을 포함

유닉스에서 필수적인 편집기

Page 23: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

vi 편집기: 세가지 모드

실행 방법: vi 명령어 뒤에 파일 이름 vi 실행시 시작하는 모드는 명령 모드 입력모드 혹은 편집모드 – 글자를 입력할 수 있는 모드

모드변환방법 - 명령모드에서 a,A,i,o,O를 입력 했을때

명령모드 혹은 ESC모드 – 커서이동 및 기타 명령어처리 모드변환방법 - 실행모드 혹은 입력모드에서 ESC키를 눌렀을

실행모드 혹은 콜론모드 – 내용바꾸기 및 기타 모드변환방법 - 명령모드에서 콜론(:)을 입력했을때

명령모드

실행모드

입력모드

ESC

:입력명령

실행완료

Page 24: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

명령 모드: 커서 이동

한문자씩 이동 h : 왼쪽, j : 위로, k : 아래로, l : 오른쪽

방향키 사용 가능

단어단위 이동 w : 다음단어로, b : 이전단어로

행단위 이동 ^ : 맨왼쪽의 첫글자, $ : 마지막글자의 끝

화면 이동 ^F: 한화면 아래로, ^B:한 화면 위로, ^D: 반 화면 아래

로, ^U: 반화면 위로

Page 25: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

명령 모드: 입력 모드 전환

a : 커서 위치의 다음 칸부터 입력하기(append)

A : 커서가 있는 줄의 끝부터 입력하기

i : 커서 위치부터 입력하기 (키보드의 Insert도 같은 기능을 합니다.)

I : 커서가 있는 줄의 맨 앞에서부터 입력하기

o : 커서 바로 아래에 줄을 만들고 입력하기(open line)

O : 커서 바로 위에 줄을 만들고 입력하기

s : 커서가 있는 단어를 지우고 입력하기

S : 커서가 있는 행을 지우고 입력하기

Page 26: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

명령 모드: 삭제

x : 커서 위치의 글자 삭제

X : 커서 바로 앞의 글자 삭제

dw : 한 단어를 삭제

d0 : 커서 위치부터 줄의 처음까지 삭제

D : d$ 커서 위치부터 줄의 끝까지 삭제

dd : 커서가 있는 줄을 삭제

dj : 커서가 있는 줄과 그 다음 줄을 삭제

dk : 커서가 있는 줄과 그 앞줄을 삭제

Page 27: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

명령 모드: 복사 및 붙여 넣기

yw : 커서 위치부터 단어의 끝까지 복사하기

y0 : 커서 위치부터 줄의 처음까지 복사하기

y$ : 커서 위치부터 줄의 끝까지 복사하기

yy : 커서가 있는 줄을 복사하기

yj : 커서가 있는 줄과 그 다음 줄을 복사하기

yk : 커서가 있는 줄과 그 앞줄을 복사하기

p : 커서의 다음 위치에 붙여 넣기

P : 커서가 있는 위치에 붙여 넣기

* 삭제된 것은 언제나 복사에 되어있음.

Page 28: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

명령 모드: 그 외 유용한 명령

작업 취소

u : 작업 취소하기 (undo)

U : 그 줄에 행해진 작업 모두 취소하기

반복:

. : 조금 전에 했던 명령을 반복하기

대소문자 변환

~ : 대소문자 전환

검색

/검색어 : 아래방향으로 찾기

?검색어 : 위방향으로 찾기

n : 다음찾기

Page 29: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

프로그램 개발

컴파일의 번거로움

컴파일 명령은 옵션이 복잡하고 짧지 않음

컴파일하는 시간도 매우 길 수도 있음

소스 프로그램은 서로 의존성 관계가 있고 의존성 관계는 매우복잡함

개발 중 컴파일을 자주 실행함

Make는 컴파일을 자동으로 효과적인 방법으로 실행함

한번 컴파일 옵션을 정해주면 계속적으로 사용할 수 있음

필요한 소스 프로그램만 컴파일 함

소스 프로그램의 의존성 관계를 명시적으로 표현할 수 있음

간단한 명령어로 쉽게 컴파일 할 수 있음

Page 30: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

컴파일의 예

소스가 program.c input.c output.c로 구성되어 있음 처음에는 세개의 모든 파일을 컴파일하여 오브젝트 파일을 만들고

링크하여 실행 프로그램을 만듬 gcc –c –rdynamic program.c –ldl gcc –c input.c gcc –c output.c gcc –o –Wall program program.o input.o output.o

이후에 program.c 만 수정되었다면 program.c만 컴파일하여 링크함 gcc –c –rdynamic progrm.c –l이 gcc –o –Wall program program.o input.o output.o

위 과정에서 개발자가 알아야 할 컴파일시 사용되는 옵션을 잘 기억하고 있어야 함 어떤 소스 파일이 변경되고 어떤 파일이 변경되지 않았는지 기억해야

함 소스 파일 간의 의존성 관계를 잘 파악하고 있어야 함

Page 31: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

Make란

프로그램 그룹(소스,라이브러리, 오브젝트, 실행파일등)을 유지하는데 필요한 유틸리티

새롭게 컴파일되어야 하는지를 자동적으로 판단해서 필요한 커맨드(gcc따위)를 이용해서 재컴파일 시킴

관련 용어 목표(타겟,target)

컴파일 과정에서 수행해야 할 작업의 이름으로 보통 생성되는 파일이름일경우가 많으나 꼭 그렇지는 않다

의존성(dependency) 두 목표의 관계로서 하나의 타겟이 변경되면 다른 이에 따라서 다른 목표

도 다시 작업이 이루어짐을 의미한다.

갱신(up to date) 의존성에 의거하여 다른 목표에 의존하는 목표가 최신의 것임을 의미한다.

Make 파일 컴파일을 통하여 생성할 목표간의 의존성 관계와 작업의 내용을 기술한

파일

Page 32: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

Make 도구의 과정

Make 도구Makefile

소스 파일들

실행프로그램

Page 33: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

간단한 makefile 구조

목표(target), 의존 관계(dependency), 명령(command)의 세개로이루어진 기분적인 규칙(rule)들이 계속적으로 나열

목표(target) 부분은 명령(command)이 수행이 되어서 나온 결과 파일

명령(command)부분에 정의된 명령들은 의존 관계(depenency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이없을 때 이곳에 정의된 것들이 차례대로 실행

*

명령 부분은 꼭 TAB 글자로 시작해야 함

* 목표 부분에는 결과 파일만 올 수 있는 것이 아니고 레이블(label) 기능을 제공하기도 함

target ... : dependency ...

command ... ...

Page 34: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

Makefile 예제

C 소스는 main.c read.c write.c로 구성되어 있고 모두 io.h라는 헤더 파일을 사용함

test : main.o read.o write.o

gcc -o test main.o read.o write.o

main.o : io.h main.c

gcc -c main.c

read.o : io.h read.c

gcc -c read.c

write.o: io.h write.c

gcc -c write.c

Page 35: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

예에서의 의존성 관계

test

main.o write.o read.o

main.c write.c read.cio.h

Page 36: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

Make 작동 예

main.o write.o read.o test가 없는 경우$ make

gcc -c main.c

gcc -c read.c

gcc -c write.c

gcc -o test main.o read.o write.o

Write.c가 갱신된 경우$make

gcc –c write.c

gcc –o test main.o read.o write.o

Io.h 가 갱신된 경우$ make

gcc -c main.c

gcc -c read.c

gcc -c write.c

gcc -o test main.o read.o write.o

Page 37: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

매크로 사용

매크로를 사용하여 makefile을 효과적으로 만들수 있음

OBJECTS = main.o read.o write.o

test : $(OBJECTS)

gcc -o test main.o read.o write.o

main.o : io.h main.c

gcc -c main.c

read.o : io.h read.c

gcc -c read.c

write.o: io.h write.c

gcc -c write.c

Page 38: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

레이블 사용

목적(타겟)으로 레이블을 사용할 수 있음

OBJECTS = main.o read.o write.o

test : $(OBJECTS)

gcc -o test main.o read.o write.o

main.o : io.h main.c

gcc -c main.c

read.o : io.h read.c

gcc -c read.c

write.o: io.h write.c

gcc -c write.c

clean:

rm –f $(OBJECTS)

Page 39: ch00: 프로그램개발도구소개...2006 System Programming ch00: 프로그램개발도구소개 GCC, GDB, vi, Make 주홍택 계명대학교, 정보통신대학 컴퓨터네트워크연구실

질의 및 토의