> 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 |