Skip to content

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 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 의 경우

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

Flag help

References


  1. Shared_Libraries_Versus_Loadable_Modules.pdf 

  2. Library_static_shared_dynamic.pdf 

  3. How_to_make_linux_library.pdf 

  4. Platform_Independent_Coding_-DLLs_and_SOs-_CodeProject.pdf 

  5. Using_static_and_shared_libraries_across_platforms.pdf 

  6. Lesstif.com_-_Shared_library_and_Linker_and_Loader.pdf