Download presentation
Presentation is loading. Please wait.
Published by泰看给 咸 Modified 7년 전
1
2007. 3. 16 (금) 김 희 준 icemichy@hufs.ac.kr
Makefile (금) 김 희 준
2
Contents gcc compile Makefile
3
gcc –compiler(definition)
Compile과정은 인간이 이해하는 언어를 CPU가 이해하는 인스트럭션으로 변환하는 과정 #objdump –S 실행파일
4
Compiler 작동과정 /usr/bin/gcc 의 내부에서 모든 과정이 일어난다.
5
Compiler 작동과정(Con’t) 실제 컴파일과정 Script --save-temps option 전처리 과정 컴파일 과정
어셈블 과정 링크 과정
6
gcc - option version 확인 Compile option -c : object file 생성
ex) gcc –c hello.c -o : 실행코드의 output filename을 지정 ex) gcc –o test test.c (default : a.out) -O[level] : Object code를 최적화. level은 0부터 3(default : -O2) -g : 실행코드에 디버깅 코드 추가 ex) gdb 같은 디버거를 사용 -I : gcc가 헤더 파일을 찾는 헤더 경로 -l : 표준 라이브러리 이외의 라이브러리 링크시 사용 ex) –lm(수학 라이브러리), -lstuff(사용자가 만든 라이브러리)
7
gcc - library library Static library (*.a) : ar를 사용하여 만든 archive 파일
static library는 compile 할 때 linker는 프로그램이 필요로 하는 부분을 library에서 찾아서 실행파일에 복사 ar r libstuff.a factorial.o // ‘libstuff.a ‘ archive 생성 ex) UNP library의 libunp.a Shared library (*.so) shared library(dynamic library)는 static library와 달리 실행파일에 단순히 "실행될 때 우선 이 라이브러리를 로딩시킬 것"이라는 메세지만을 남겨두게됨 shared library를 사용하면 실행화일의 크기가 작아지고, 메모리와 하드 디스크의 용량도 적게 차지 Linux의 기본 동작은 일단 shared library가 있으면 그것과 link를 시키고, 그렇지 않으면 static library를 가지고 link ※ archive : ‘members’ 라고 불리는 서브 파일들을 담고 있는 파일. ‘ar’에 의해서 관리되고, archive file의 목적은 link를 위한 sub-routine library이다.
8
gcc – compile 시 유의사항 ‘unpv13e/intro/daytimetcpcli.c’의 compile
compile 할 때 command가 너무 복잡 Makefile 사용 compile 주의사항 Solaris에서 socket library를 사용하는 program을 compile 할 때에는 ‘–lnsl’과 ‘–lsocket’ library를 link 해야함.
9
Makefile 프로그램 그룹을 유지하는데 필요한 유틸리티
프로그램 개발뿐만 아니라 컴파일러처럼 일종의 명령어 방식으로 처리되는 모든 곳에서 쓰임 makefile은 make가 이해할 수 있도록 한 일종의 쉘 스크립트 언어 (makefile database 라 불리기도 함) 결과 파일을 생성시키기 위한 파일들간의 관계, 명령어 등을 기술 각 파일에 대한 반복적 명령을 자동화시켜 개발자들의 수고를 덜고 시간 절약 효과
10
기본적인 구조 Basic Structure – Example1 test : main.o read.o write.o
gcc –o test main.o read.o write.o main.o : io.h main.c read.o : io.h read.o write.o : io.h write.o 주의사항 : 반드시 “TAB”키를 이용할 것. TAB key 미 사용시 명령절을 타겟절로 해석함. “ 의존관계 목표절 TAB 명령절 목표(target) 부분 명령(command)이 수행이 되어서 나온 결과 파일을 지정한다. 당연히 목적 파일(object file)이나 실행 파일이 될 것이다. 명령(command) 부분 정의된 명령들은 의존 관계(dependency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 된다.
11
기술파일 작성시 기본규칙 비어있는 행은 무시 ‘#’은 주석 ‘\’를 이용해 기술 내용이 긴 내용을 다음 행으로 표현 가능
Ex) diary : memo.o calendar.o \ main.o diary : memo.o calendar.o main.o 종속 항목이 없는 타겟도 가능 Ex) Clean : rm –rf *.0 target1 target2 같은 의미
12
‘\’를 이용한 기술 결과
13
Macro 사용 매크로는 프로그램 코딩 시와 같이 사용해서 값을 대입 그러나 사용할 때는 반드시 $(..) 안에 넣어서 사용
OBJECTS = client.obj server.obj array_i.obj test : $(OBJECTS) cl -o test $(OBJECTS) client.obj : array.h client.cxx cl -c client.cxx server.obj : array.h server.cxx cl -c server.cxx array_i.obj : array.h array_i.cxx cl -c array_i.cxx 아래는 client.obj server.obj array_i.obj 파일들을 OBJECTS 라는 매크로로 바꾸는 makefile 예제
14
Macro 작성시 기본규칙 ‘=‘을 포함하여 ‘#’은 주석 ‘\’를 이용해 기술 내용이 긴 내용을 다음 행으로 표현 가능
Ex) NAME = string ‘=‘ 좌측에는 Macro 이름, 우측에는 정의 문자열 ‘#’은 주석 ‘\’를 이용해 기술 내용이 긴 내용을 다음 행으로 표현 가능 Macro 참조시 소괄호나 중괄호를 둘러싸고 앞에 ‘$’ $(NAME) #string ${NAME}.c #stirng.c 중복된 정의는 최후에 사용할 것
15
Macro 사용시 주의사항 구분을 목적으로 “string”으로 지정 시 “ ”도 문자열로 인식
이름에 ‘:’, ‘=‘, ‘#’, TAB 사용 불가 치환될 위치보다 먼저 정의 되어야 함
16
미리 정의되어 있는 Macro Make –p 명령으로 내부에 정의된 매크로 리스트들이 나열
ASFLAGS = ‘as’ Option setting AS = as CFLAGS = ‘gcc’ Option setting CC = cc (= gcc ) CPPFLAGS = ‘g++’ Option setting CXX = g++ LDLFAGS = ‘ld’ Option setting LD = ld LFLAGS = ‘lex’ Option setting LEX = lex YFLAGS = ‘yacc’ Option setting YACC = yacc MAKE_COMMAND = make RM = rm -f
17
미리 정의되어 있는 Macro(cont’d)
18
내부 Macro List Ex) main.o : main.c io.h
$? 현재의 타겟보다 최근에 변경된 종속 항목 리스트 (확장자 규칙에서 사용불가) $^ 현재 타겟의 종속 항목 리스트 현재 타겟의 이름 $< 현재 타겟보다 최근에 변경된 종속 항목 리스트 (확장자 규칙에서만 사용 가능) $* 현재 타겟보다 최근에 변경된 현재 종속 항목의 이름 $% 현재의 타겟이 라이브러리 모듈일 때 .o 파일에 대응되는 이름 Ex) main.o : main.c io.h gcc –c $*.c result : $* => main test : $(OBJS) gcc –o $S.c result : = test
19
내부 Macro List 기술 적용 결과
20
.o와 대응되는 .c를 발견하면 아래 명령을 수행한다.
확장자 규칙의 사용 파일의 확장자를 보고, 그에 따라 적절한 연산을 수행시키는 규칙. .cxx 파일은 일반적으로 C++ 소스 코드 .obj 파일은 목적 파일(Object file) .cxx 파일을 컴파일 -> .obj 파일 .SUFFIXES : .c .o %.o : %.c # OBJECTS = main.o calendar.o memo.o CC = gcc CFLAGS = –c all : diary Diary : $(OBJECTS) $(CC) -o $^ .o와 대응되는 .c를 발견하면 아래 명령을 수행한다. $(CC) –c –o $< SUFFIXES : make 파일에게 주의 깊게 처리할 파일들의 확장자를 등록
21
Macro Substitution $(MACRO_NAME : OLD = NEW) 을 사용
MY_NAME = Micheal Jackson YOUR_NAME = $(MY_NAME : Jack = Jook) >Result : Jookson OBJS = main.o read.o write.o SRCS = $(OBJS : .o = .c) >Result : SRCS = main.c read.c write.c 한 100개 정도의 파일을 일일이 지정 하지 않아도 되는 편리함이 있음.
22
재귀적 make 사용 여러 개의 파일과 디렉토리를 포함하는 프로젝트 compile시
23
Make 사용시 유용한 TIP -C dir : 우선 먼저 입력한 direction 으로 이동 후 다음 명령 실행
-d : 모든 process information 출력 -h : help -v : Makefile version 출력 -p : Makefile 내부 확장자 출력 -k : error가 발생해도 계속 진행
24
unplib directory를 include하여 compile
UNP Lib를 사용하는 Makefile unplib directory를 include하여 compile 만들고자 하는 실행 프로그램파일 이름 필요한 object compile
Similar presentations