본문 바로가기

Academy I/Tech Academy

Linux make 사용법 [I]

1. gcc 옵션

-o :오브젝트 파일명 지정

-I(대문자 아이) : 헤더파일을 검색하는 디렉토리 목록 추가

-L : 라이브러리를 검색하는 디렉토리 목록 추가

-l : 라이브러리 파일을 컴파일 시 링크

-g : 바이너리 파일에 표준 디버깅 정보 포함

-O(0~3) : 컴파일 코드 최적화

-static : 정적 라이브러리 링크

-c : c파일과 같은 object파일 생성

 

2. Example

<gcc_test1.c>
#include<stdio.h>
#include"head_a.h"

void function1();
void function2();


void main(){

   printf("gcc_test1\n");

   function1();

   function2();

}


<gcc_test2.c>
#include<stdio.h>
#include"head_a.h"
#include"head_b.h"

extern void function1(){

   printf("gcc_test2\n");

}


<gcc_test3.c>
#include<stdio.h>
#include"head_c.h"
#include"head_b.h"

extern void function2(){

   printf("test3\n");

}


------------------------------------------------------------------------

쉘 명령어

=> 헤더 파일 껍데기만 만들기

touch head_a.h

touch head_b.h

touch head_c.h


=> gcc 컴파일

gcc -c gcc_test1.c            -> test1.c와 이름이 같은 object파일 생성

gcc -c gcc_test2.c            -> test2.c와 이름이 같은 object파일 생성       

gcc -c gcc_test3.c            -> test3.c와 이름이 같은 object파일 생성

gcc -o gcc_test gcc_test1.o gcc_test2.o gcc_test3.o

                               -> 세 개의 object 파일 링크하여 test 실행파일 생성

./test                        -> test 실행




1. makefile 만들기

1) 기본 형태

     대상 : 의존성 정의
              명령


2) example source

# vi makefile                   -> makefile 생성
 

newTest:gcc_test1.o gcc_test2.o gcc_test3.o

gcc -o newTest gcc_test1.o gcc_test2.o gcc_test3.o

test1.o:gcc_test1.c head_a.h

gcc -c gcc_test1.c

test2.o:gcc_test2.c head_a.h head_b.h

gcc -c gcc_test2.c

test3.o:test3.c head_c.h head_b.h

gcc -c gcc_test3.c


clean:                                     -> 컴파일 과정에서 생긴 불필요한 파일 제거

rm test1.o test2.o test3.o

3) 명령어
make                                                  -> makefile make
make clean                                         -> make 후 불필요한 파일 제거
 

2. makefile에 매크로 활용

1) makefile 작성 시 반복되는 입력을 피하기 위해 사용


2) example source

//매크로 정의

OBJF = hello1.o hello2.o hello3.o

//소스

hello: $(OBJF)

gcc -o hello $(OBJF)

hello1.o: hello1.c a.h

gcc -c hello1.c

hello2.o: hello2.c

gcc -c hello2.c

hello3.o: hello3.c

gcc -c hello3.c

clean:

rm $(OBJF)

3) 명령어
make                                                  -> makefile make
make clean                                         -> make 후 불필요한 파일 제거

 

3. 내부 매크로

1) 내부 매크로 종류

$@ : 현재 목표 파일의 이름

$* : 확장자를 제외한 현재 목표 파일 이름

$< : 현재 필수 조건 파일 중 첫 번째 파일 이름(의존성파일 중에서)

$? : 현재 대상보다 최근에 변경된 필수 조건 파일 이름

$^ : 현재 모든 필수 조건 파일


2) example source

OBJF = hello1.o hello2.o hello3.o

hello: $(OBJF)

gcc -o $@ $^

hello1.o: hello1.c a.h

gcc -c $*.c

hello2.o: hello2.c

gcc -c $*.c

hello3.o: hello3.c

gcc -c $*.c

clean:

rm $(OBJF)

3) 명령어
make                                                  -> makefile make
make clean                                         -> make 후 불필요한 파일 제거

 

4. 접미사 규칙

OBJF = hello1.o hello2.o hello3.o

hello: $(OBJF)

gcc -o $@ $(OBJF)

.c.o:

gcc -c $(CFLAGS) $<

clean:

rm $(OBJF)

3) 명령어
#make CFLAG="-g"                               -> makefile make

 

5. make 옵션

-f : makefile나 Makefile 다른 이름의 make파일을 실행

     (make 파일명을 사용자 지정)

-n : make가 실행하는 명령을 출력만 하고 실행 안 한다.

-W파일이름 : 이름의 파일이 변경된 것처럼 실행 (ex touch..?)

-s : make가 명령어를 출력 안하고 실행

-r : make의 모든 내장 규칙을 사용할 수 없다.

-d : make 실행시 디버깅 정보도 같이 출력

-k : 한 대상을 구성하는 데 실패해도 다음 대상을 계속 구성




1. gdb 사용방법

1. gdb 사용방법

컴파일시 -g 옵션 설정

#gdb 실행파일명 -디버깅 모드로 변환

(gdb)quit - 디버깅 모드 종료

 

2. example source



<debug1.c>

#include <stdio.h>

int sum(int i);

void main(){

   printf("%d\n", sum(4));

}

int sum(int i){

   if(i==1)

return 1;

   else

return i+sum(i-1);

}

 

3. 명령어

gcc -g -o debug1 debug1.c

gdb debug1                                    -> debug1 디버깅 모드 변환

(gdb)quit                                       -> 디버깅 모드 종료

 

2. 디버깅 명령어

help : gdb 설명

명령어 첫글자+tab : 첫글자로 시작하는 명령어 자동 검색

list (라인 넘버): 소스출력

list 4,7

list 함수명


run : 디버깅 모드에서 실행


whatis i: i의 데이터 타입

print i:변수 i의 값

set variable i=2 //변수값 할당


break 문장번호 : 해당 라인에 정지점 설정

break 함수이름 : 해당 함수 시작점에 정지점 설정

break 문장번호 또는 함수이름 if조건 : 그 라인에서 if를 만족하면 정지

info break:현재 설정된 정지점 목록 출력


delete 라인넘버: 해당 라인에 설정된 정지점 제거

delete : 정지점 전체 제거

step : 단계별 실행. 함수를 만나면 함수로 들어가 한줄씩 실행

next : 단계별 실행. 함수를 만나면 함수를 건너뜀




[출처] gcc 컴파일 및 옵션|작성자 우동


'Academy I > Tech Academy' 카테고리의 다른 글

Linux gdb 사용법 [II]  (0) 2014.12.22
Linux make 사용법 [II]  (0) 2014.12.22
VirtualBox의 Linux(CentOS)에서 공유폴더 설정  (0) 2014.12.22
Linux gdb 사용법 [I]  (0) 2014.12.19
Unix System Programming 10  (0) 2014.12.16
Unix System Programming 9  (0) 2014.12.16
Unix System Programming 8  (0) 2014.12.16
Unix System Programming 7  (0) 2014.12.16