library - Gakgu/Gakgu.github.io GitHub Wiki
개발시 공통적으로 사용되는 기능들을 모듈화 한 파일들을 가리킨다.
-
정적 라이브러리(static library) :
XXX.lib -
동적 링크 라이브러리(dynamic-link library) :
XXX.dll
-
정적 라이브러리(static library) :
libXXX.a -
공유 라이브러리(shared library) :
libXXX.so
-
정적 라이브러리(static library) :
libXXX.a -
다이나믹 라이브러리(dynamic library) :
libXXX.dylib
$ 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
-
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 :
배포 버전을 의미한다.
-
install name :
라이브러리 적재시 install name으로 다이나믹 라이브러리를 찾는다. soname과 달리 절대 경로가 포함되어 있다. -
identification name :
?????
$ ldd FILE
$ otool -L FILE
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
-
@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 -L 파일
-
rpath 확인 :
$ otool -l 파일 | grep -A 2 RPATH
-
install name 확인 :
$ otool -D 파일