'정적 라이브러리 만들기'에 해당되는 글 1건

  1. 2012.04.04 정적 라이브러리, 동적 라이브러리 만들기
프로그래밍/C2012. 4. 4. 14:25

정적 라이브러리

컴파일 시 링커로 라이브러리의 오브젝트 코드를 만들고자 하는 타겟 바이너리에 추가된다.

동적 라이브러리

컴파일 시, 라이브러리가 사용된 곳에 공유 라이브러리를 쓴다고 해놓고, 런타임시 동적링크로 링크한다.

 

 

정적 라이브러리 만들기

언제나와 같이 예제로 살펴보자.
우선 foo1.c라는 파일을 하나 만들어 다음과 같이 넣어보자.

자 이제는 foo2.c를 만들어 다음과 같이 만들자.

마지막으로 이 둘을 interface해 줄 역활의 foolib.h을 만들자.

 

코드 입력을 다 끝냈으면 이제 foo1.c와 foo2.c를 컴파일 하자.

gcc -c foo1.c foo2.c

 

그러면 foo1.o 와 foo2.o라는 오브젝트 파일이 만들어지는데, 이 둘을 다음과 같이 묶어주자.

ar rscv libfoo.a foo1.o foo2.o

 

그러면 libfoo.a라는 파일이 생성된다.  이 파일이 이제 우리가 쓸 수 있는 정적라이브러리 파일이다. 제대로 동작하나 보기 위해, example.c를 만들자.

 

컴파일은 다음과 같이 한다.

gcc -o example example.c -L./ -lfoo

-L 은 gcc에게 라이브러리를 찾을 디렉터리를 지정한다.

-l은 링크할 라이브러리를 지정한다. l뒤에 붙은 이름은 라이브러리 이름에서 lib을 뗀(libfoo의 경우 foo만 남는다) 것이며, -l 옵션은 컴파일 할 대상의 소스가 지정되는 뒤에 두면 된다.

 

 

동적 라이브러리 만들기

 

동적 라이브러리를 살펴 볼때도 위에서 나열한 소스를 쓰자. (재활용은 위대하다.)

gcc -fPIC -c foo1.c foo2.c

-fPIC은 컴파일러에게 위치에 상관없이 수행할 수 있는 코드로 컴파일 하라고 하는 것이다. 이제 이렇게 해서 나온 오브젝트 파일을 정적 라이브러리와 합쳐(?)보자.

 

다음과 같이 쳐보자.

gcc -shared -Wl,-soname,libfoo.so.0 -o libfood.so.0.0.0 foo1.o foo2.o

-shared는 동적 라이브러리를 우선 시해서 링크 하라고 지시한다.

-soname은 정적 라이브러리의 soname을 정한다.

 

자 이제 gcc 링크와 동적 링크를 위한 심볼릭 링크만 생성해 주자.

ln -s libfoo.so.0.0.0 libfoo.so
ln -s libfoo.so.0.0.0 libfoo.so.0

libfoo.so는 컴파일 시에 실행 파일들을 링크 할 때 링커가 찾을 수 있게 만든 것이며, libfoo.so.0은 실행 시에 동적 링커가 soname으로 찾을 수 있게 soname을 파일명으로 하는 libfoo.so.0.0.0파일의 심볼릭 링크를 만든 것이다. 

 

동적 링크에 대한 작업도 필요하다.  libfoo.so.0.0.0파일이 있는 디렉터리를 /etc/ld.so.conf에 추가해 줘야 하며, ldconfig로  /etc/ld.so.cache를 새로 생성한다.

 

마지막으로 다음과 같이 실행하여 컴파일 하자.

gcc -o example example.c -L./ -lfoo

 

'프로그래밍 > C' 카테고리의 다른 글

구조체 초기화 방법  (0) 2012.08.21
error: expected identifier before numeric constant  (0) 2012.07.03
sprintf 사용법  (0) 2012.04.03
sscanf 사용법  (0) 2012.03.28
exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
Posted by code cat