library - Gakgu/Gakgu.github.io GitHub Wiki

개요

개발시 공통적으로 사용되는 기능들을 모듈화 한 파일들을 가리킨다.

종류

windows

  • 정적 라이브러리(static library) :
    XXX.lib

  • 동적 링크 라이브러리(dynamic-link library) :
    XXX.dll

linux

  • 정적 라이브러리(static library) :
    libXXX.a

  • 공유 라이브러리(shared library) :
    libXXX.so

Mac

  • 정적 라이브러리(static library) :
    libXXX.a

  • 다이나믹 라이브러리(dynamic library) :
    libXXX.dylib

라이브러리 생성(gcc)

정적 라이브러리 만들기

$ gcc -c A.c B.c C.c
$ ar -rc libXXX.a A.o B.o C.o

공유 라이브러리 만들기

$ gcc -c -fPIC XXX.c
$ gcc -shared -Wl,-soname,libXXX.so -o libXXX.so.x.x.x XXX.o

공유 라이브러리의 이름

linux

  • real name :
    실제 라이브러리 이름이다. libXXX.so.major_version.minor_version.release_version과 같은 형식으로 작성된다.

  • soname :
    real name에서 마이너 버전을 제외한 이름이다. 라이브러리 적재시 soname으로 공유 라이브러리를 찾는다.

  • linker name :
    real name에서 lib와 .so 사이에 있는 이름을 말한다. 빌드시 링커 네임으로 라이브러리를 찾는다.

  • major version :
    이전 버전과 호환이 안될 경우 메이저 버전을 올린다.

  • minor version :
    이전 버전과 호환이 될 경우 마이너 버전을 올린다.

  • release version :
    배포 버전을 의미한다.

Mac

  • install name :
    라이브러리 적재시 install name으로 다이나믹 라이브러리를 찾는다. soname과 달리 절대 경로가 포함되어 있다.

  • identification name :
    ?????

라이브러리 의존 정보 확인

linux

$ ldd FILE

Mac

$ otool -L FILE

linux 라이브러리 사용법

symbolic link 만들기 :

soname으로 된 심볼릭 링크와 거기서 메이저 버전을 뺀 심볼릭 링크를 만든다.

    $ ln -s libXXX.so.0.0.0 libXXX.so.0
    $ ln -s libXXX.so libXXX.so.0

적재할 공유 라이브러리 인식 :

/etc/ld.so.conf 에 공유 라이브러리가 있는 디렉토리를 추가하고 ldconfig 명령어를 사용한다.

$ echo /usr/local/lib >> /etc/ld.so.conf
$ ldconfig

mac 라이브러리 사용법

install_name_tool 사용하기

  • @executable_path :
    실행 파일이 포함되어 있는 디렉토리의 절대 경로

  • @loader_path :
    로드한 파일의 디렉토리 절대 경로

  • @rpath :
    2개 이상의 경로를 가질 수 있는 사용자(?)지정 경로

  • 실행파일에 적재된 라이브러리의 install name 변경하기 :

      $ install_name_tool -change <old_install_name> <new_install_name> <executable>
    
  • 다이나믹 라이브러리의 identification name 변경하기

      $ install_name_tool -id <old_install_name> < new_install_name>
    

otool 사용하기

  • 의존성 확인 :

      $ otool -L 파일
    
  • rpath 확인 :

      $ otool -l 파일 | grep -A 2 RPATH
    
  • install name 확인 :

      $ otool -D 파일
    
⚠️ **GitHub.com Fallback** ⚠️