컴파일이란?

컴파일 과정

소스파일 + 헤더파일 -> 중간파일(전처리) -> 오브젝트파일(컴파일) -> 실행파일(링킹)

컴파일 옵션

  • I : 헤더파일 위치 지정 옵션, 표준 디렉토리(/usr/include)외에 있는 헤더파일의 디렉토리 경로 지정

  • Dname : name에 지정된 심볼을 1로 정의

  • ON : 컴파일된 코드를 최적화 시키는 옵션

  • L : 라이브러리 파일 이 존재하는 디렉토리 경로 지정

  • l string : 옵션 뒤에 지정한 라이브러리 파일을 지정하여 컴파일 시 링크(단 파일명은 libstring.a 또는 libstring.so)

  • c : 컴파일 단계까지만 수행하고 링크 수행 x 하여 오브젝트파일을 생성

  • g : 실행파일에 표준 디버깅 정보 포함하여 gdb, DDD 등 디비거 이용시 옵션 사용

  • Wall : gcc가 제공하는 모든 경고를 알 수 있다. 시스템 혹은 커널 프로그램 작성 시 이 옵션을 함께 넣어 컴파일 하는 것이 적절.

컴파일 옵션을 이용하여 라이브러리 파일을 링크

#include <stdio.h>
#include <math.h>
 
int main() {
  double dnum = 100.0;
 
  printf("%lf", sqrt(dnum));
 
  return 0;
}

위 코드의 sqrt는 표준 C 라이브러리가 아니라 별도의 math 라이브러리 파일에 들어가 있기 때문에 컴파일 시 함께 링크될 수 있도록 옵션을 추가 해야 한다.

수학 함수 이용시

라이브러리 파일명파일 위치컴파일 시 필요 옵션
libm.a 또는 libm.so/usr/lib 와 /lib-lm
gcc -o test test.c -lm

라이브러리 생성

라이브러리 생성을 하게 되면 동일 기능이 여러 군데 중복되지 않아 효율적인 프로그램 작성을 할 수 있다.

생성 형태

C 컴파일러는 컴파일 시 기본적으로 /usr/lib에 있는 디렉토리에서 라이브러리 함수를 찾아 링크한다.

만약 없다면 -l 혹은 -L 옵션을 이용하여 다른 디렉토리에 있는 라이브러리도 이용 가능하다.

라이브러리의 이름은 lib로 시작하여 .a 나 .so 의 확장자로 구성된다.

정적 라이브러리

프로그램 오브젝트 파일 + 미리 생성한 라이브러리 함수 오브젝트 코드 = 실행 파일

정적 라이브러리 함수를 사용하게 되면 코드 중복을 막을수는 있지만 메모리에 동일한 코드가 존재하게 되어 메모리, 디스크 등이 자원을 효율적으로 사용하지 못하는 단점이 있다.

라이브러리 생성 방법

  1. 소스 파일 생성 vi static.c

  2. 오브젝트 파일 생성(static.o) gcc -c static.c

  3. 라이브러리 파일 생성 ar rv libstatic.a static.o -> ar 도구를 이용하여 static.o 오브젝트를 libstatic.a 라는 정적 라이브러리 파일로 생성

공유 라이브러리

프로그램 오브젝트 코드 + 라이브러리 함수 정보 = 실행 파일

라이브러리 생성 방법

  1. 소스 파일 생성 vi shared.c

  2. 오브젝트 파일 생성 gcc -c -fPIC shared.c -> -c 옵션과 -fPIC 옵션을 이용하여 재배치 가능한 오브젝트 파일 생성

  3. 라이브러리 파일 생성 ld -shared -o libshared.so shared.o -> ld 도구를 이용하여 shared.o 오브젝트를 libshared.so 공유 라이브러리 파일로 생성

라이브러리 작성 예시

//static.c
#include <stdio.h>
 
void static_function(int num) {
    printf("this is static function : %d\n", num);
}
//shared.c
#include <stdio.h>
 
void shared_function(int num1, num2) {
  printf("this is shared function : %d %d\n", num1, num2);
}
//static.h
void static_function(int);
//shared.h
void shared_function(int, int);
//main.c
#include <stdio.h>
#include "static.h"
#include "shared.h"
 
int main() {
    printf("main start.\n");
    static_function(100);
    shared_function(200, 300);
    printf("main end.\n");
    return 0;
}

필요한 파일들을 작성합니다.

$ gcc -c static.c
$ ar rv libstatic.a static.o

정적 라이브러리 파일을 생성합니다.

$ gcc -c -fPIC shared.c
$ ld -shared -o libshared.so shared.o

동적 라이브러리 파일을 생성합니다.

 
$ gcc -o main main.c -L. -lstatic -lshared
 

gcc 옵션을 통해 현재 디렉토리 경로를 지정하고 해당 라이브러리 파일들을 지정합니다.

 
$ ./main
 

실행파일 실행 시 공유 라이브러리를 찾을 수 없다는 오류가 뜨게 됩니다.

 
$ export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:.
 
$ ./main


'Operator System > Linux' 카테고리의 다른 글

쉘 프로그래밍 간단한 문법  (0) 2017.10.26
프로세스와 생성방법  (0) 2017.10.26
Make  (0) 2017.10.26
파일  (0) 2017.10.26
환경변수  (0) 2017.10.26

+ Recent posts