Library
라이브러리(Library)는 소프트웨어를 만들 때 쓰이는 클래스나 서브루틴들의 모임을 가리키는 말이다.
Static library
정적 라이브러리(Static Library)는 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다. 즉, 정적 라이브러리(statically-linked library)는 루틴(routine) 외부 함수와 변수들의 집합으로, 컴파일러, 링커, 바인더 등에 의해 목표된 애플리케이션으로 복사되어 오브젝트 파일과 독립적으로 실행할 수 있는 실행 파일을 생성하는데에 사용된다. 윈도의 .LIB파일과 같이 .a의 확장자를 갖고있다.
How to use
[root@localhost ~]$ gcc -c func1.c func2.c
[root@localhost ~]$ ls
func1.c func1.o func2.c func2.o program.c
[root@localhost ~]$ ar crv libfoo.a func1.o func2.o
a - func1.o
a - func2.o
[root@localhost ~]$ gcc program.c -o program libfoo.a
[root@localhost ~]$ ls
func1.c func1.o func2.c func2.o lib.h program program.c libfoo.a
[root@localhost ~]$ ./program
Shared Library
공유 라이브러리.
How to use
[root@localhost ~]$ gcc -fPIC -c *.c
[root@localhost ~]$ gcc --shared -Wl,-soname,libfoo.so -o libfoo.so func1.o func2.o
[root@localhost ~]$ nm -D libfoo.so
[root@localhost ~]$ sudo ldconfig -n .
[root@localhost ~]$ gcc -o program program.o -L. -lfoo
[root@localhost ~]$ ldd program
OR:
[root@localhost ~]$ gcc -fPIC -c *.c
[root@localhost ~]$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
[root@localhost ~]$ ln -s libfoo.so.1.0 libfoo.so.1
[root@localhost ~]$ ln -s libfoo.so.1 libfoo.so
[root@localhost ~]$ LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH
[root@localhost ~]$ su
[root@localhost ~]# cp libfoo.so.1.0 /usr/local/lib
[root@localhost ~]# /sbin/ldconfig
[root@localhost ~]# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )
Dynamic Library
- Dynamic-link library
- DLL:Example:Windows - Windows에서 DLL을 동적으로 로드하는 방법.
동적 라이브러리(Dynamic Library)는 프로그램 수행 도중 해당 모듈이 필요할 때 불러쓰는 프로그램 모듈이다. 윈도우에서는 주로 .dll 확장자를 가지며, 리눅스에서는 주로 .so 확장자를 가진다.
How to check
종속성 확인은 아래의 툴로 확인할 수 있다.
Relocation
Load-time relocation of shared libraries, 공유 라이브러리의 로드 시점 재배치(Relocation)에 관한 내용을 정리.
Dynamic vs Shared
동적 라이브러리(Dynamic libraries)는 런타임(Run-time)에 적제되는 라이브러리 이다. 공유 라이브러리(Shared libraries) 또는 공유 객체(Shared objects)는 하나의 복사본이 실행중인 프로세스간에 공유 할 수 있도록 설계된 동적 라이브러리이다.
- Implicit linking (암시적 링크)
- 암시적 링킹은 프로그램 실행 전에 필요한 모든 DLL을 메모리에 로딩한다. 때문에 실행까지 걸리는 시간이 길어질 수 있다.
- Explicit linking (명시적 링크)
- 명시적 링킹은 필요한 순간에 하나씩 DLL을 로딩할 수 있기 때문에 그만큼 실행까지 걸리는 시간이 짧고, DLL 로딩에 걸리는 시간을 분산시킬 수 있다.
- LoadLibrary, GetProcAddress, FreeLibrary와 같은 Win32 Api가 존재한다.
MSVC Dynamic library
샘플 코드는 이 곳을 참조하면 된다.
Mac OSX Shared libraries
GCC 의 경우
- KLDP - 4. 동적 적재(DL) 라이브러리
- [추천] Library 제작 (static, shared, dynamic) 2
- linux library(static, shared, dynamic)제작방법 3
Troubleshooting
Unsafe use of relative rpath
MacOSX에서 아래와 같은 에러 메시지가 출력될 수 있다.
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/cv2.so, 2): Library not loaded: lib/libopencv_shape.3.0.dylib
Referenced from: /usr/local/lib/python2.7/site-packages/cv2.so
Reason: unsafe use of relative rpath lib/libopencv_shape.3.0.dylib in /usr/local/lib/python2.7/site-packages/cv2.so with restricted binary
이 경우 install_name_tool을 사용하여 해당 라이브러리의 상대경로를 절대경로로 변경하면 된다.
See also
Favorite site
- Wikipedia (en) Library에 대한 설명
- Linux에서 라이브러리를 만드는 방법은?
- [추천] Joinc: 라이브러리 만들기
- Joinc: C++로 작성된 라이브러리사용
- Platform Independent Coding - DLLs and SOs 4
- C++ Cross Platform Dynamic Libraries; Linux and Windows
- linux library 제작(static, shared, dynamic)
- Make 기반 빌드 시스템 (9): 공유 라이브러리 지원
- 2.3 Writing and Using Libraries
- [추천] Using static and shared libraries across platforms 5
- [추천] 동적 라이브러리(shared library)와 Linker/Loader 이해하기 6
Flag help
- 프로그램 라이브러리 하우투(rdynamic관련)
- gcc -rdynamic 옵션?
- Solaris, gcc에서 dlopen로 shared object 붙일 때 오류 (
--export-dynamic
관련)