05 gcc make gdb GCC 05 gcc make
05. gcc, make, gdb
GCC 05. gcc, make, gdb 2
gcc 실습: 실행 파일 만들기(1/2) • 목적 파일을 이용하여 실행파일 만들기 $ gcc main. o $ ls a. out main. c main. o $. /a. out My 1 st gcc programming. • “-o” 옵션을 이용하여 실행파일명 지정하여 만들기(목적 파일 이용) $ gcc –o pro 01 main. o $ ls a. out main. c main. o pro 01 $. /pro 01 My 1 st gcc programming. 05. gcc, make, gdb 9
gcc 실습: 정적 라이브러리 파일 만들기(1/4) • 다음의 명령어를 차례로 실행 $ $ $ • mkdir ~/cfiles/common : common 디렉터리 생성 mkdir ~/cfiles/common/src : 소스파일을 보관할 디렉터리 생성 mkdir ~/cfiles/common/include : 헤더 파일을 보관할 디렉터리 생성 mkdir ~/cfiles/common/lib : 라이브러리 파일을 보관할 디렉터리 생성 mkdir ~/cfiles/pro 02 : 두 번째 프로그램을 보관할 디렉터리를 생성 cd ~/cfiles/common/include : 헤더파일을 보관할 디렉터리로 이동 vi 편집기로 다음의 헤더파일을 작성 $ vi lib. h // 2010. 04. 09. #define PI 3. 141592 extern double Get. Circle. Area(double radius); extern int Get. Sum(int arr[], int size); extern double Get. Average(int arr[], int size); 05. gcc, make, gdb 11
gcc 실습: 정적 라이브러리 파일 만들기(2/4) • 다음의 디렉터리로 이동 $ cd ~/cfiles/common/src • vi 편집기를 이용하여 다음의 소스파일 만들기 $ vi lib. c // 2010. 04. 09. #include <lib. h> double Get. Circle. Area(double radius) { return radius*PI; } int Get. Sum(int arr[], int size) { int i, sum = 0; for(i = 0; i < size; i++) sum += arr[i]; return sum; } double Get. Average(int arr[], int size) { return (double)Get. Sum(arr, size)/(double)size; } 05. gcc, make, gdb 12
gcc 실습: 정적 라이브러리 파일 만들기(3/4) • 목적 파일 만들기 $ gcc –I. . /include –c lib. c $ ls lib. c lib. o • 정적 라이브러리 파일 만들기 $ ar rscv libstatic. a lib. o a – lib. o $ ls libstatic. a lib. c lib. o $ ar t libstatic. a lib. o $ mv libstatic. a. . /lib 03. LINUX 중·고급명령어 13
gcc 실습: 정적 라이브러리 파일 만들기(4/4) • 다음의 디렉터리로 이동 $ cd ~/cfiles/pro 02 • main함수 작성 $ vi main. c // 2010. 04. 09. #include <stdio. h> #include <lib. h> main() { int radius; int arr[] = {4, 5, 3, 2, 1, 6}; printf(“Input a radius: ”); scanf(“%d”, &radius); printf(“Area of Circle: %f₩n₩n”, Get. Circle. Area(radius)); printf(“Average of array values: %f₩n”, Get. Average(arr, 6)); } • 실행파일 생성 및 파일 실행 $ gcc –I. . /common/include –L. . /common/lib –o test 1 main. c –lstatic $ ls 라이브러리 파일 명시 main. c test 1 libmy. a에서 lib와. a를 제외한 파일명 입력 $. /test 1 ※ 주의: 가장 뒤에 와야 함 03. LINUX 중·고급명령어 14
gcc 실습: 공유 라이브러리 파일 만들기 • 다음 디렉터리로 이동 $ cd ~/cfiles/common/src • 목적파일을 삭제 $ rm *. o • 다음의 과정으로 목적파일 및 공유 라이브러리 파일 생성 $ gcc –f. PIC –I. . /include –c lib. c $ gcc –shared –f. PIC –o libdynamic. so lib. c lib. o $ file libdynamic. so: ELF 32 -bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped $ mv libdynamic. so. . /lib • 실행파일 생성 및 실행 $ cd ~/cfiles/pro 02 $ gcc –o test 2 main. c –I. . /common/include –L. . /common/lib –ldynamic $ ls main. c test 1 test 2 $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /home/자신의그룹/자신의ID/cfiles/common/lib $. /test 2 03. LINUX 중·고급명령어 15
GDB 05. gcc, make, gdb 16
gdb 사용하기 • gdb 설치 확인 $ ls /usr/bin/gdb $ • gdb 실행 $ mkdir ~/cfiles/pro 03 $ cd ~/cfiles/pro 03 $ vi debug 1. c – debug 1. c #include <stdio. h> int sum(int i); int main() { printf(“%d₩n”, sum(10)); return 0; } int sum(int i) { return i + sum(i-1); } 05. gcc, make, gdb 17
breakpoint 이용하기 – debug 3. c (cont. ) 05. gcc, make, gdb 24
breakpoint 이용하기 • 정지점 설정하기 (cont. ) 05. gcc, make, gdb 26
단계별로 실행하기 • step 05. gcc, make, gdb 29
단계별로 실행하기 • next 05. gcc, make, gdb 30
MAKE 05. gcc, make, gdb 32
make의 기본 동작(1/4) • 소스 파일들의 내용 – diary. h : #include <stdio. h> int memo(); int calendar(); – memo. c : #include “diary. h” int memo(){ printf(“function meme. ₩n”); return 0; } – calendar. c : #include “diary. h” int calendar(){ printf(“function calendar. ₩n”); return 0; } – main. c : #include “diary. h” int main(){ memo(); calendar(); return 0; } 05. gcc, make, gdb ※ 각 파일들은 cfiles 디렉터리 밑에 pro 04 디렉터리를 생성하여 저장 36
make의 기본 동작(2/4) • 소스 파일 구조도 diary. h memo. c calendar. c main. c memo. o calendar. o main. o diary 05. gcc, make, gdb 37
make의 기본 동작(3/4) • Makefile의 내용 all : diary : memo. o calendar. o main. o gcc –o diary memo. o calendar. o main. o memo. o : memo. c gcc –W –Wall –c memo. c calendar. o : calendar. c gcc –W –Wall –c calendar. c main. o : main. c gcc –W –Wall –c main. c • ※ -W : 합법적이지만 모호한 코딩에 대한 부가 정보 제공 ※ -Wall : 모든 모호한 문법에 대한 경고 메시지 출력 소스의 엄격성을 제공하기 위해 사용 실행 05. gcc, make, gdb 38
매크로의 사용(4/6) • 실습 및 결과 – ~/cfiles/ex_make 디렉터리에 Makefile 02를 작성 A 1 = $(B 1) BB B 1 = $(C 1) CC C 1 = D A 2 : = $(B 2) BB B 2 : = $(C 2) CC C 2 : = D A 3 : = A B 3 : = $(A 3) B C 3 : = $(B 3) C NAME 1 : = string 1 NAME 1 += string 2 NAME 2 = he NAME 2 ? = she NAME 3 ? = you all : @echo @echo $(A 1) $(A 2) $(C 3) $(NAME 1) $(NAME 2) $(NAME 3) 05. gcc, make, gdb 43
매크로의 사용(5/6) • 실습 – ~/cfiles/pro 04의 Makefile을 다음과 같이 수정하고 make 실행 – rm 명령어를 사용, 목적파일(*. o)와 실행파일(diary)를 삭제하고 make 다시 실행 CC CFLAGS TARGET OBJECT = = gcc -W -Wall diary memo. o calendar. o main. o all : $(TARGET) : $(OBJECT) $(CC) $(CFLAGS) –o $(TARGET) $(OBJECT) memo. o : memo. c $(CC) $(CFLAGS) –c memo. c calendar. o : calendar. c $(CC) $(CFLAGS) –c calendar. c main. o : main. c $(CC) $(CFLAGS) –c main. c 05. gcc, make, gdb 44
내부적으로 사용되는 매크로의 사용(4/4) • 내부 매크로를 이용한 Makefile 수정 – ~/cfiles/pro 04의 Makefile을 다음과 같이 수정 후 make 실행 – 실행 전 목적파일과 실행파일을 삭제 : $ rm –f *. o diary CC CFLAGS TARGET OBJECT = = gcc -W -Wall diary memo. o calendar. o main. o all : $(TARGET) : $(OBJECT) $(CC) $(CFLAGS) –o $@ $^ memo. o : memo. c $(CC) $(CFLAGS) –c $^ calendar. o : calendar. c $(CC) $(CFLAGS) –c $^ main. o : main. c $(CC) $(CFLAGS) –c $^ 05. gcc, make, gdb 49
더미 타겟의 사용 • 실습 – ~/cfiles/pro 04에 있는 Makefile을 다음과 같이 수정 TARGET OBJECT = diary = $(patsubst %. c, %. o, $(wildcard *. c)) all : $(TARGET) : $(OBJECT) $(CC) -o $@ $^ clean : rm –rf *. o diary • 실행 결과 05. gcc, make, gdb 56
재귀적 make의 사용(2/4) • 최상위 Makefile(~/cfiles/pro 05) – cd memo && make 대신 make –C memo를 사용해도 됨 TARGET OBJECT = diary = memo. o calendar. o main. o all : MEMO CALENDAR MAIN $(TARGET) MEMO : cd memo && make CALENDAR : cd calendar && make MAIN : cd main && make $(TARGET) : $(OBJECT) $(CC) -o $@ $^ clean : cd memo && make clean cd calendar && make clean cd main && make clean -rm –rf *. o diary 05. gcc, make, gdb 62
재귀적 make의 사용(3/4) • 하위 디렉터리의 Makefile(모두 동일하게 작성) OBJECT = $(patsubst %. c, %. o, $(wildcard *. c)) CFLAGS = -I. . /include all : $(OBJECT) cp –f $^. . / clean : rm –rf *. o • make 실행 05. gcc, make, gdb 63
재귀적 make의 사용(4/4) • 일반적으로 최상위 Makefile은 다음과 같이 구현 DIRS TARGET OBJECT = memo calendar main = diary = memo. o calendar. o main. o all : objs $(CC) –o $(TARGET) $(OBJECT) objs : @for dir in $(DIRS); do ₩ make –C $$dir || exit $? ; ₩ done clean : @for dir in $(DIRS); do ₩ make –C $$dir clean; ₩ done -rm –rf *. o $(TARGET) – make 파일의 길이가 짧아지고, 새로운 서브 디렉터리의 추가가 용이 05. gcc, make, gdb 64
함수의 사용(3/8) • 문자열 처리 함수(2) – $(sort 문자열) : 문자열을 정렬 MACRO = bbb aaa ccc aaa ddd STR = $(sort $(MACRO)) echo : @echo $(STR) – $(strip 문자열) : 공백 문자의 제거 STR = aaaa bbbb echo : @echo $(strip $(STR)) 05. gcc, make, gdb 70
함수의 사용(4/8) • 문자열 처리 함수(3) : 문자 필터링 함수들 – $(filter 패턴, 문자열) FILE = memo. c head. h main. c asm. S diary. h SRCS = $(filter %. c %. S, $(FILES)) HEADS = $(filter %. h, $(FILES)) echo : @echo “source files : $(SRCS)” @echo “head files : $(HEADS)” – $(filter-out 패턴, 문자열) • 패턴과 일치하지 않는 문자열을 필터링함 05. gcc, make, gdb 71
- Slides: 78