슬라이드 1

Download Report

Transcript 슬라이드 1

[Unix Programming]
gcc & make
Young-Ju, Han
Email: [email protected]
Website : http://imtl.skku.ac.kr/~yjhan
contents
 gcc 기반 Complier and linking
 Make
2005-03-21
2005 UNIX Programming
2
Complier and linking
like.c
source
like.i
cc1
C Complier
cpp0 or cpp
preprocessor
like
Like.s
like.o
ld or collect2
linker
as
assembler
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
2005-03-21
2005 UNIX Programming
3
cpp 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
2005-03-21
2005 UNIX Programming
4
cpp or cpp0 Preprocessor
 error
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 }
$gcc –E –o preproerror.i preproerror.c
preproerror.c:3:23: myinclude.h: No such file or directory
2005-03-21
2005 UNIX Programming
5
cc1 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
2005-03-21
2005 UNIX Programming
6
cc1 Compiler
 error
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 }
$gcc -W -Wall -S parsingerror.c
parsingerror.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 cast
parsingerror.c:7: warning: passing arg 2 of `strcpy' makes pointer from
integer without a cast
parsingerror.c:8: warning: implicit declaration of function `var3'
2005-03-21
2005 UNIX Programming
7
as Assembler
 C Assembler command
 %gcc –c like.c or gcc –c like.s
 %as –o like.o hello.s
2005-03-21
2005 UNIX Programming
8
ld 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
2005-03-21
2005 UNIX Programming
9
ld or correct2 Linker
 Static linking
/usr/lib/libc.a
like.o
printf.o
scanf.o
read.o
ld or
correct2
…..
like.o
printf.o
scanf.o
read.o
…..
2005-03-21
2005 UNIX Programming
10
ld or correct2 Linker
 error
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 }
$gcc -W -Wall –o linkingerror linkingerror.c
Undefined
first referenced
symbol
in file
var3
/var/tmp//cc6XQGZ1.o
ld: fatal: Symbol referencing errors. No output written to linkingerror
collect2: ld returned 1 exit status'
2005-03-21
2005 UNIX Programming
11
Making library
file1.c
mylib.h
#include <stdio.h>
void func1(){
printf(“Hello func1\n”);
}
void func2(){
printf(“Hello func2\n”);
}
file2.c
void func1();
void func2();
void func3();
like.c
#include <stdio.h>
#include “mylib.h”
int main() {
func1(); func2(); func3();
}
#include <stdio.h>
void func3(){
printf(“Hello func3\n”);
}
2005-03-21
2005 UNIX Programming
12
Making library
 static library
$gcc –c file1.c file2.c
$ar rscv libmy.a file1.o file2.o
 Compiling like.c and executing like
$gcc –o slike like.c –L./ -lmy
$./like
2005-03-21
2005 UNIX Programming
13
Making library
 dynamic library
$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
 Compiling like.c and executing like
$gcc –o dlike like.c –L./ -lmy
$./like
2005-03-21
2005 UNIX Programming
14
make
 $ make all $make dynamic , $make static, $make clean…
all : dlike slike
dynamic : dlike
static : slike
slike : like.o
gcc –static –W –Wall –o slike like.o –L./ -lmy
dlike : like.o
gcc–W –Wall –o slike like.o –L./ -lmy
like.o : like.c
gcc -W -Wall -c -o like.o like.c
clean :
rm –rf *.o
2005-03-21
2005 UNIX Programming
15
make
 기술 파일의 기본 구조
CC = gcc
target1 : dependency1 dependency2
< TAB >command1
command2
Definition macro
target2 : dependency3 dependency4 dependency5
command3
command4






Rule 1
command
Rule 2
command
비어있는 항은 무시한다
#를 만나면 개행문자를 만날 때까지 무시한다
기술 행이 길어지면 ‘\’를 사용해서 이어나갈 수 있다.
‘;’는 명령행을 나눌 때 사용한다.
종속 항목이 없는 타겟도 사용가능하다.
명령 부분에는 어떠한 명령어가 와도 상관 없다
2005-03-21
2005 UNIX Programming
16
make
 매크로의 사용
NAME = string
NAME = string
NAME:2=string
NAMe#2=string
#ok
#bad
#bad
#bad
 매크로 참조
NAME = string
${NAME}
$(NAME)
${NAME}.c
macro_${NAME}
#string
#string
#string.c
#macro_string
 내부적으로 정의되어 있는 매크로
CC
RM
CFLAGS
#c compiler default : cc
#remove file default : rm –f
# c complier flags default : null
2005-03-21
2005 UNIX Programming
17
make
 자동 매크로 리스트
$?
$^
$@
$<
$*
#현재의 타겟보다 최근에 변경된 종속 항목 리스트 (확장자 규칙에서 사용불가)
#현재 타겟의 종속 항목 리스트(확장자 규칙에서 사용불가)
#현재 타겟의 이름
#현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서만 사용가능)
#현재 타겟보다 최근에 변경된 현재 종속 항목의 이름(확장자 규칙에서만 사용가능)
diary : file1.o file2.o file3.o
gcc –W –Wall –o diary file1.o file2.o file3.o
file1.o : file1.c
gcc –W –Wall –c –o file1.o file1.c
file2.o : file2.c
gcc –W –Wall –c –o file2.o file2.c
file2.o : file2.c
gcc –W –Wall –c –o file2.o file3.c
2005-03-21
2005 UNIX Programming
18
make
 자동 매크로 적용
CC = gcc
CFLAGS = -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 $@ $^
2005-03-21
2005 UNIX Programming
19
make
 확장자 규칙 (make –p)
%.o: %.c
# commands to execute (built-in):
$(COMPILE.c) $(OUTPUT_OPTION) $<
# cc –c –o $@ $<
.c.o :
$(COMPILE.c) $(OUTPUT_OPTION) $<
# cc –c –o $@ $<
 적용 예
CC = gcc
CFLAGS = -W –Wall
diary : file1.o file2.o file3.o
$(CC) $(CFLAGS) –o $@ $^
2005-03-21
2005 UNIX Programming
20
make
 확장자 규칙 확장
CC = gcc
CFLAGS = -W –Wall
.SUFFIZES : .o .c
%.o: %.c
$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<
diary : file1.o file2.o file3.o
$(CC) $(CFLAGS) –o $@ $^
CC = gcc
CFLAGS = -W –Wall
.SUFFIZES : .o .c
.c.o :
$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<
diary : file1.o file2.o file3.o
$(CC) $(CFLAGS) –o $@ $^
2005-03-21
2005 UNIX Programming
21
make
 와일드카드 매칭 기법과 대입 참조 기법
CC = gcc
CFLAGS = -W –Wall
SRCS = file1.c file2.c file3.c
SRCS = $(wildcard *.c) #file1.c file2.c file3.c
OBJS = $(SRCS:.c=.o)
#file1.o file2.o file3.o
.c.o:
$(CC) $(CFLAGS) –DDEBUG –c –o $@ $<
diary : $(OBJS)
$(CC) $(CFLAGS) –o $@ $^
2005-03-21
2005 UNIX Programming
22