본문 바로가기

프로그래밍/C,C++

[Linux] 라이브러리

 

 

> Static Library

 

라이브러리 생성( lib  + 이름 . a )

$ ar rc libsample.a a.o b.o c.o

r : 정적 라이브러리

c : 신규 생성

 

라이브러리에 포함된 오브젝트 확인

$ ar t libsample

 

라이브러리 링크( -L에폴더, -l뒤에 라이브러리 이름을 적는다. )

$ gcc -o hello_static_world hello_static_world.c -L./ -lsample

 

라이브러리 파일의 lib , .a 는 제외한 라이브러리 이름만 적음~

 

 

 

 

> Shared Library / Dynamic Linked Library

 

라이브러리 생성

$ gcc -fPIC -c a.c b.c. c.c

-fPIC : 위치와 관계가 없이 수행될 있는 코드로 컴파일

 

$ gcc -shared -W1,-soname,libsample.so.1 -o libsample.so.1.0.0 a.o b.o c.o

-shared : 각 오브젝트 링크시 동적 라이브러리 사용

-Wl : 이후의 콤마로 구분된 옵션을 링커에 바로 전달

-soname : 라이브러리 이름, 리눅스에서 사용하는 규칙으로 로더가 인식하기 위한

  문자열이다. 

- o : output

 

라이브러리 이름은 일반적인 관례를 따른다. lib + Name + .so. + xxx.yyy.zzz

우선 gcc 는 a.o , b.o, c.o 세개의 오브젝트를 가지고 libsample.so.1.0.0 이라는 파일을 생성한다.

이 파일에 대한 정보를 링커에게 libsample.so.1 이라고 알린다.

 

 

libsample.so.1.0.0 파일이 생성되는데, 실제 컴파일시 사용되는 이름은 libsample.so 이고,

링커가 인식할수 있는 이름은 libsample.so.1 이다.

따라서, 실제 파일에 이 두개의 심볼릭 링크를 생성한다.

 

$ ln -s libsample.so.1.0.0 libsample.so

$ ln -s libsample.so.1.0.0 libsample.so.1

 

 

라이브러리 링크

$ gcc -o hello_shared hello_shared.c -L./ -llibsample

 

실행하면 라이브러리를 찾을 수 없다고 나오는데, 해당 라이브러리를 LD_LIBRARY_PATH

에 지정된 폴더에 넣거나 별도의 폴더인 경우 해당 폴더를 지정해 주어야 한다.

 

 

라이브러리 검색 위치

/etc/ld.so.conf

경로를 추가한 뒤 해당 내용을 반영 시키기 위해 

$ sudo ldconfig 실행

 

환경변수

LD_LIBRARY_PATH

 

 

 

 

 

 

 

> 공유 라이브러리 사용

실행될때 로더가 라이브러리를 올리는 형태와 실행 중 동적으로 로드 하는 방법이 있다.

링크시에 라이브러리를 사용하기 위해, 라이브러리의 선언부(헤더파일)이 필요하며,

동적 링크는 별도의 헤더 없이 로드가 가능하다.

하지만 메쏘드등을 함수포인터로 정의해 사용하기 위해서는 어짜피 헤더가 필요함~

 

win32  플랫폼과 다른점은 win32 공유 라이브러리의 경우 DLL 외에 LIB 파일이 하나 추가되어

해당 LIB 파일을 링크시에 사용토록 되어 있다.

하지만 리눅스는 공유건 동적이건 모두 so 형태만을 사용한다.

 

#include <dlfcn.h>

void *dlopen(const char* filename, int flag);

const char* dlerror(void);

void* dlsym(void *handle, char *symbol); // 해당 문자열과 일치하는 메쏘드를 찾아 줌.

int dlclose(void *handle);

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

[C#] 파일 읽고,쓰기 기초  (0) 2013.09.12
[C#] 이미지 처리 기본 사항들  (0) 2013.09.12
[C#] 이벤트  (0) 2013.09.12
[C#] 폼 띄우기  (0) 2013.09.12
GCC 옵션  (0) 2011.07.21
POSIX 쓰레드 함수들  (0) 2010.04.16
[Linux] 세마포어 설정  (0) 2010.04.15
바이트오더~ 비트 스트림~  (0) 2009.06.04
delete obj, delete [] obj 차이  (0) 2009.06.04
[C]  (0) 2009.06.04