22
[Unix Programming] [Unix Programming] gcc & make gcc & make Young-Ju, Han Young-Ju, Han Email: Email: [email protected] [email protected] Website : http://imtl.skku.ac.kr/~yjhan Website : http://imtl.skku.ac.kr/~yjhan

[Unix Programming] gcc & make

  • Upload
    paytah

  • View
    35

  • Download
    0

Embed Size (px)

DESCRIPTION

[Unix Programming] gcc & make. Young-Ju, Han Email: [email protected] Website : http://imtl.skku.ac.kr/~yjhan. contents. gcc 기반 Complier and linking Make. Complier and linking. like.c source. like.i. cc1 C Complier. cpp0 or cpp preprocessor. Like.s. like. like.o. as - PowerPoint PPT Presentation

Citation preview

Page 1: [Unix Programming] gcc & make

[Unix Programming][Unix Programming]gcc & makegcc & make

Young-Ju, HanYoung-Ju, HanEmail: Email: [email protected]@imtl.skku.ac.kr

Website : http://imtl.skku.ac.kr/~yjhanWebsite : http://imtl.skku.ac.kr/~yjhan

Page 2: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

22

contentscontents

gcc 기반 Complier and linking Make

Page 3: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

33

Complier and linkingComplier and linking

like.csource

like.i

Like.slike.olike

cpp0 or cpp preprocessor

cc1 C Complier

as assemblerld or collect2

linker

gcc –v –save-temps –o like like.c

gcc –v –l/myinclude1:/myinclude2 –DDEBUG –Wall –W –O2 –o like like.c -L/mylibdir1/mylibdir2 –lmylibname

Page 4: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

44

cpp or cpp0 Preprocessorcpp or cpp0 Preprocessor

C Preprocessor command %gcc –E –o like.i like.c

Function File inclusion

-Idir option Marco substitution

-Dmacro –Dmacro=defn –Umacro option Conditional compile

#if #else #elif #ifdef #endif

Command %gcc -o like –Idir –Dmacro –Umacro like.c

Page 5: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

55

cpp or cpp0 Preprocessorcpp or cpp0 Preprocessor

error

$gcc –E –o preproerror.i preproerror.cpreproerror.c:3:23: myinclude.h: No such file or directory

1 #include <stdio.h>2 #include <string. h>3 #include “myinclude.h”4 int main(void){5 int var1, var2;6 var2=4;7 strcpy(var1,var2);8 var1 = var3()+var2;9 printf("var1=%d %s\n", var1);10 return(0);11 }

Page 6: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

66

cc1 Compilercc1 Compiler

C Compiler command %gcc –S –o like.s like.c

Function Parsing (Syntax Analysis)

-W -Wall option Creating RTL(Register Transfer Language)

gcc –da like.c Optimization

–O0, -O1, -O2, -O3, -Os option -g, -g0, -g1, -g2, -g3 option

Creating object code Command

%gcc -o like –Wall –Idir –Dmacro –Umacro –O3 like.c

Page 7: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

77

cc1 Compilercc1 Compiler

error

$gcc -W -Wall -S parsingerror.cparsingerror.c: In function `main':parsingerror.c:6: error: syntax error before "var2"parsingerror.c:7: warning: passing arg 1 of `strcpy' makes pointer from integer without a castparsingerror.c:7: warning: passing arg 2 of `strcpy' makes pointer from integer without a castparsingerror.c:8: warning: implicit declaration of function `var3'

1 #include <stdio.h>2 #include <string. h>3 int main(void){4 int var1, var2;5 int a6 var2=4;7 strcpy(var1,var2);8 var1 = var3()+var2;9 printf("var1=%d\n", var1);10 return(0);11 }

Page 8: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

88

as Assembleras Assembler

C Assembler command %gcc –c like.c or gcc –c like.s %as –o like.o hello.s

Page 9: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

99

ld or correct1 Linkerld or correct1 Linker

C Linker command gcc –o like like.o

Function Symbol reference resolving & location

Options -Ldir (cf. LD_LIBRARY_PATH) -llibname -static

Static linking Static library

Dynamic linking Dynamic library

Page 10: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1010

ld or correct2 Linkerld or correct2 Linker

Static linking

like.o printf.o

/usr/lib/libc.a

ld or correct2

scanf.o

read.o

…..

printf.o

scanf.o

read.o

…..

like.o

Page 11: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1111

ld or correct2 Linkerld or correct2 Linker

error

$gcc -W -Wall –o linkingerror linkingerror.cUndefined first referenced symbol in file var3 /var/tmp//cc6XQGZ1.old: fatal: Symbol referencing errors. No output written to linkingerrorcollect2: ld returned 1 exit status'

1 #include <stdio.h>2 #include <string. h>3 int main(void){4 int var1, var2;5 int a;6 var2=4;7 strcpy(var1,var2);8 var1 = var3()+var2;9 printf("var1=%d\n", var1);10 return(0);11 }

Page 12: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1212

Making libraryMaking library

#include <stdio.h>

void func1(){printf(“Hello func1\n”);

}

void func2(){printf(“Hello func2\n”);

}

#include <stdio.h>

void func3(){printf(“Hello func3\n”);

}

void func1();void func2();void func3();

file1.c

file2.c

mylib.h

#include <stdio.h>#include “mylib.h”

int main() {func1(); func2(); func3();

}

like.c

Page 13: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1313

Making libraryMaking library

static library

Compiling like.c and executing like

$gcc –c file1.c file2.c$ar rscv libmy.a file1.o file2.o

$gcc –o slike like.c –L./ -lmy$./like

Page 14: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1414

Making libraryMaking library

dynamic library

Compiling like.c and executing like

$gcc –fPIC –c file1.c file2.c$gcc –shared –W1,-soname,libmy.so.0 –o libmy.so.0.0.0 file1.o file2.o

$ln –s libmy.so.0.0.0 libmy.so # gcc 링크를 위한 파일$ln –s libmy.so.0.0.0 libmy.so.0 # 동적 링크를 위한 파일$setenv LD_LIBRARY_PATH mylibdir:$LD_LIBRARY_PATH

$gcc –o dlike like.c –L./ -lmy$./like

Page 15: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1515

makemake

$ make all $make dynamic , $make static, $make clean…

all : dlike slikedynamic : dlikestatic : slike

slike : like.ogcc –static –W –Wall –o slike like.o –L./ -lmy

dlike : like.ogcc–W –Wall –o slike like.o –L./ -lmy

like.o : like.cgcc -W -Wall -c -o like.o like.c

clean :rm –rf *.o

Page 16: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1616

makemake

기술 파일의 기본 구조

비어있는 항은 무시한다 # 를 만나면 개행문자를 만날 때까지 무시한다 기술 행이 길어지면 ‘ \’ 를 사용해서 이어나갈 수 있다 . ‘;’ 는 명령행을 나눌 때 사용한다 . 종속 항목이 없는 타겟도 사용가능하다 . 명령 부분에는 어떠한 명령어가 와도 상관 없다

CC = gcctarget1 : dependency1 dependency2< TAB >command1

command2

target2 : dependency3 dependency4 dependency5command3command4

Definition macro

Rule 1command

Rule 2command

Page 17: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1717

makemake

매크로의 사용

매크로 참조

내부적으로 정의되어 있는 매크로

NAME = string #okNAME = string #bad

NAME:2=string #badNAMe#2=string #bad

CC #c compiler default : ccRM #remove file default : rm –fCFLAGS # c complier flags default : null

NAME = string${NAME} #string$(NAME) #string${NAME}.c #string.cmacro_${NAME} #macro_string

Page 18: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1818

makemake

자동 매크로 리스트$? # 현재의 타겟보다 최근에 변경된 종속 항목 리스트 ( 확장자 규칙에서 사용불가 )$^ # 현재 타겟의 종속 항목 리스트 ( 확장자 규칙에서 사용불가 )$@ # 현재 타겟의 이름$< # 현재 타겟보다 최근에 변경된 종속 항목 리스트 ( 확장자 규칙에서만 사용가능 )$* # 현재 타겟보다 최근에 변경된 현재 종속 항목의 이름 ( 확장자 규칙에서만 사용가능 )

diary : file1.o file2.o file3.o gcc –W –Wall –o diary file1.o file2.o file3.o

file1.o : file1.cgcc –W –Wall –c –o file1.o file1.c

file2.o : file2.cgcc –W –Wall –c –o file2.o file2.c

file2.o : file2.cgcc –W –Wall –c –o file2.o file3.c

Page 19: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

1919

makemake

자동 매크로 적용CC = gccCFLAGS = -W –Wall

diary : file1.o file2.o file3.o $(CC) $(CFLAGS) –o $@ $^

file1.o : file1.c $(CC) $(CFLAGS) –c -o $@ $^

file2.o : file2.c $(CC) $(CFLAGS) –c -o $@ $^

file2.o : file2.c $(CC) $(CFLAGS) –c -o $@ $^

Page 20: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

2020

makemake

확장자 규칙 (make –p)

적용 예

%.o: %.c# commands to execute (built-in): $(COMPILE.c) $(OUTPUT_OPTION) $< # cc –c –o $@ $<

CC = gccCFLAGS = -W –Wall

diary : file1.o file2.o file3.o $(CC) $(CFLAGS) –o $@ $^

.c.o :$(COMPILE.c) $(OUTPUT_OPTION) $< # cc –c –o $@ $<

Page 21: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

2121

makemake

확장자 규칙 확장CC = gccCFLAGS = -W –Wall

.SUFFIZES : .o .c%.o: %.c

$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<

diary : file1.o file2.o file3.o $(CC) $(CFLAGS) –o $@ $^

CC = gccCFLAGS = -W –Wall

.SUFFIZES : .o .c

.c.o :$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<

diary : file1.o file2.o file3.o $(CC) $(CFLAGS) –o $@ $^

Page 22: [Unix Programming] gcc & make

2005-03-212005-03-21 2005 UNIX Program2005 UNIX Programmingming

2222

makemake

와일드카드 매칭 기법과 대입 참조 기법CC = gccCFLAGS = -W –WallSRCS = file1.c file2.c file3.cSRCS = $(wildcard *.c) #file1.c file2.c file3.cOBJS = $(SRCS:.c=.o) #file1.o file2.o file3.o

.c.o:$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<

diary : $(OBJS) $(CC) $(CFLAGS) –o $@ $^