[System Programming] 3장. C 프로그래밍 환경
제 3장 C 프로그래밍 환경
3.1 컴파일러
gcc 컴파일러
- gcc(GNU cc) 컴파일러 / 상업용 C 컴파일러(cc)
$ gcc [-옵션] 파일
/\$cc [-옵션] 파일
- GNU(GNU is Not Unix) 프로젝트의 freeware 컴파일러. 본래 C 언어용 컴파일러로 시작하였으므로 GNU C Compiler의 약자였으나 2.9 버전에 이르러 C뿐만이 아니라 Objective C, Pascal, Ada와 같은 언어도 지원. GNU Compiler Collection으로 개명
- 컴파일(시험)
- $ gcc long.c
- $ a.out //실행 파일 생성
- -c 옵션
- $ gcc - c long.c //object file 생성
- -o 옵션
- $ gcc -o long long.o //실행 파일 이름 지정
- 혹은
- $ gcc -o long long.c
- $ long // 실행 파일
- -O 옵션
- $ gcc -O -o long long.c //optimized compile
- compiler가 판단하여 기계어로 번역할 때 최적화 된 실행을 제공
- -S 옵션
- $ gcc -S long.c //assembly 파일의 long.s 생성
단일 모듈 프로그램: long.c
#include <stdio.h>
#define MAXLINE 100
void copy(char from[], char to[]);
char line[MAXLINE]; // 입력 줄
char longest[MAXLINE]; // 가장 긴 줄
/*입력 줄 가운데 가장 긴 줄 프린트 */
main()
{
int len;
int max;
max = 0;
while (gets(line) != NULL) {
len = strlen(line);
if (len > max) {
max = len;
copy(line, longest);
}
}
if (max > 0) // 입력 줄이 있었다면
printf("%s", longest);
return 0;
}
/* copy: from을 to에 복사; to가 충분히 크
다고 가정*/
void copy(char from[], char to[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
단일 모듈 프로그램
- 한 코드안에 전부 작성하는 프로그램(단일 모듈 프로그램)
- 코드의 재사용(reuse)이 어렵다.
- 여러 사람이 참여하는 프로그래밍이 어렵다.
- 예를 들어, 다른 프로그램에서 copy 함수를 재사용 하기 힘들다.
다중 모듈 프로그램
- 다중 모듈 프로그램
- 여러 개의 .c 파일들로 이루어진 프로그램
- 일반적으로 복잡하며 대단위 프로그램인 경우에 적합
다중 모듈 프로그램의 예
- main 프로그램과 copy 함수를 분리하여 별도 파일로 작성
- main.c
- copy.c
- copy.h //함수의 프로토타입을 포함하는 헤더 파일
- 컴파일
- $ gcc -c main.c
- $ gcc -c copy.c
- $ gcc -o main main.o copy.o
- 혹은
- $ gcc -o main main.c copy.c
- 헤더 파일은 안 넣어도 되는 구나?!
main.c
#include <stdio.h>
#include "copy.h" //copy 함수의 원형(프로토타입 선언)
char line[MAXLINE]; // 입력 줄
char longest[MAXLINE]; // 가장 긴 줄
/*입력 줄 가운데 가장 긴 줄 프린트 */
main()
{
int len;
int max;
max = 0;
while (gets(line) != NULL) {
len = strlen(line);
if (len > max) {
max = len;
copy(line, longest);
}
}
if (max > 0) // 입력 줄이 있었다면
printf("%s", longest);
return 0;
}
copy.c
#include <stdio.h>
#include "copy.h"
/* copy: from을 to에 복사; to가 충분
히 크다고 가정*/
void copy(char from[], char to[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
copy.h
#define MAXLINE 100
void copy(char from[], char to[]);
3.2 make 시스템
make 시스템
- make 시스템
- 대규모 프로그램의 경우에는 헤더, 소스 파일, 목적 파일, 실행 파일의 모든 관계를 기억하고 체계적으로 관리하는 것이 필요
- make 시스템을 이용하여 효과적으로 작업
- Makefile
- 실행 파일을 만들기 위해 필요한 파일들과 만드는 방법을 기술
- make 시스템은 파일의 상호 의존 관계를 파악하여 실행 파일을 쉽게 다시 만듦.
- $ make [-f 메이크파일]
- 옵션이 없으면 그냥 Makefile(default) 혹은 makefile을 사용
메이크파일의 구성
- Makefile의 구성 형식
- 대상리스트
- 의존 리스트: 뭐가 컴파일 되기 위해선 뭐가 있어야 하고 (이런 것들)
- 명령 리스트: 명령어 리스트
- 대상리스트
-
예: Makefile
main:main.o copy.o gcc -o main main.o copy.o main.o: main.c copy.h gcc -c main.c copy.o: copy.c gcc -c copy.c
-
make 실행(시험)
$ make 혹은 $ make main
gcc -c main.c
gcc -c copy.c
gcc -o main main.o copy.o
-
copy.c 파일이 변경된 후
$ make
gcc -c copy.c
gcc -o main main.o copy.o
3.3 디버거
gdb
- 가장 대표적인 디버거
- GNU debugger(gdb)
- gdb 주요 기능
- 정지점(breakpoint) 설정
- 한 줄씩 실행
- 변수 접근 및 수정
- 함수 탐색
- 추적(tracing)
- gdb 사용을 위한 컴파일
- -g 옵션을 이용하여 컴파일
- $ gcc - g -o longest longest.c
- 다중 모듈 프로그램
- $ gcc -g -o main main.c copy.c
- -g 옵션을 이용하여 컴파일
- gdb 실행
- $ gdb [실행파일]
- $ gdb main
gdb 기능
- 소스보기 : l(ist)
- l [줄번호] : 지정된 줄을 프린트
- l [파일명]:[함수명] : 지정된 함수를 프린트
- set listsize n : 출력되는 줄의 수를 n으로 변경
(gdb) l copy
#include <stdio.h>
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char from[], char to[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i:
}
gdb 기능
-
정지점 : b(reak), clear, d(elete)
b [파일:]함수 파일의 함수 시작 부분에 정지점 설정
b n n번 줄에 정지점을 설정
b +n 현재 줄에서 n개 줄 이후에 정지점 설정
b -n 현재 줄에서 n개 줄 이전에 정지점 설정
info b 현재 설정된 정지점을 출력
clear 줄번호 해당 정지점을 삭제
d 모든 정지점을 삭제
(gdb) b copy
Breakpoint 1 at 0x804842a: file copy.c, line 9.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804842a in copy at copy.c:9
gdb 기능
- 프로그램 수행
- r(un) 인수 명령 줄 인수를 받아 프로그램 수행
- k(ill) 프로그램 수행 강제 종료
- n(ext) 멈춘 지점에서 다음 줄을 수행하고 멈춤
- s(tep) n과 같은 기능 함수 호출 시 함수 내부로 진입
- c(ontinue) 정지점을 만날 때 까지 계속 수행
- u 반복문에서 빠져나옴
- finish 현재 수행하는 함수의 끝으로 이동
- return 현재 수행 중인 함수를 빠져나옴
- quit 종료
$ (gdb) r
Starting program: /home/chang/바탕화면/src/main
Merry X-mas !
Breakpoint 1, copy (from=0x8049b60 "Merry X-mas !", to=0x8049760 "") at copy.c:98 i = 0;
- 변수 값 프린트: p(rint)
- p [변수명] 해당 변수 값 프린트
- p 파일명::[변수명] 특정 파일의 전역변수 프린트
- p [함수명]::[변수명] 특정 함수의 정적 변수 프린트.
- info locals 현재 상태의 지역변수 리스트
(gdb) p from $1 = 0x8049b60 “Merry X-mas !”
(gdb) n 9 while ((to[i] = from[i]) != ‘\0’)
(gdb) n 10 ++i;
(gdb) p to $2 = 0x8049760 “M”
(gdb) c Continuing Happy New Year ! Breakpoint 1, copy (from=0x8049b60 “Happy New Year !”, to=0x8049760 “Merry X-mas !”) at copy.c:9 9 i = 0;
(gdb) p from $3 = 0x8049b60 “Happy New Year !”
(gdb) n 10 while ((to[i] = from[i])!=’\0’)
(gdb) n 11 ++i;
(gdb) p to $4 = 0x8049760 “Herry X-mas !” // Happy….에서 첫 번째 자리에서 break가 걸려 첫 번째 문자에 H가 들어갔다.
(gdb) c Continuing Ctrl-D 입력 Happy New Year ! // 더 긴 줄 프린트 Program exited normally.
DDD(Data Display Debugger)
- gdb를 위한 그래픽 사용자 인터페이스
- 정지점을 설정
- 소스코드의 원하는 위치에 커서를 이동하고 상단의 Break 버튼
- Next나 Step 같은 명령어 버튼을 이용하여 한 줄씩 실행
- 하단에는 gdb 명령어 입력 창
3.4 이클립스 통합개발환경
이클립스(Eclipse)
- 통합 개발 환경
- 윈도우, 리눅스, 맥 등의 다양한 플랫폼에서 사용 가능
- 다양한 언어(C/C++, Java 등)를 지원
- 막강한 기능을 자랑하는 자유 소프트웨어
- 이클립스 설치
- CentOS 6 설치: [S/W Development Workstation] 선택하면 자동 으로 설치됨
- 메인메뉴: [시스템]->[관리]->[소프트웨어 추가/제거] 이용하여 이 클립스를 선택하여 설치할 수 있음.
- https://www.eclipse.org: 리눅스용 이클립스를 다운 받아 설치 가능
댓글남기기