라이브러리란 특정한 코드(함수 혹은 클래스)를 포함하고 있는 컴파일된 파일입니다.

라이브러리에도 그 쓰임새에 따라서 여러가지 종류가 있습니다.(크게 3가지) 가장 흔하게 쓰일수 있는 “정적라이브러리"와 “공유라이브러리”, “동적라이브러리” 가 있습니다. 이들 라이브러리가 서로 구분되어지는 특징은 라이브러리의 로드 타이밍입니다.

메모리를 효율적으로 쓰기 위해서는 lib 보다 dll 방식이 좋습니다.(필요할 때만 링크해서 쓰고 필요 없으면 바로 해제)

lib 방식은 프로그램이 실행되면 바로 메모리를 차지하고 프로그램이 종료될 때까지 메모리에 남아있습니다.

확장자별 라이브러리 구분

  • .a : 리눅스 / 정적 라이브러리
  • .so : 리눅스 / 동적 라이브러리
  • .lib : 윈도우 / 정적 라이브러리
  • .dll : 윈도우 / 동적 라이브러리

동적 라이브러리 dll

  • DLL을 구현하고 컴파일하고 나면 Static library와는 다르게 output file이 2개가 생성됩니다.
  • 하나는 *.lib 파일이고 하나는 *.dll 파일이다.
  • 여기서 *.lib 파일은 Static library의 *.lib 파일과는 전혀 다릅니다.
  • Static library의 *.lib 파일은 라이브러리 전체 코드를 포함하는 바이너리이며, DLL의 *.lib 파일은 DLL이 제공하고자 하는 **함수 정보(함수명)**을 가지는 정보 파일입니다.
  • 프로그램 시작할 때 같이 로딩되어 프로그램 종료 할 때 메모리에서 해제되는 방법을 **암시적 링킹(Implicit Linking)**이라 합니다
  • DLL의 *.lib 파일을 이용하여 링킹하는 것을 **암시적 링킹(implicit linking)**이라고 합니다
  • 프로그램 실행 시 필요시만 외부 DLL 파일에서 함수를 참조합니다
  • 실행 바이너리를 링크 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일을 함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 되는 것입니다.
  • 즉 *.lib 파일은 링크시 필요하고, *.dll 파일은 실행시 필요합니다.

정적 라이브러리 lib

  • 프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리를 의미합니다.
  • 컴파일링킹 단계에서 실행 파일결합됩니다.
  • 특정 기능의 라이브러리를 static 하게 제작한다는 것은 컴파일의 link 단계에서 **라이브러리(*.lib 파일)**를 실행 바이너리에 포함시킨다는 말입니다.
  • 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업없이, 그리고 독립적으로 라이브러리 함수들을 사용할 수 있습니다.
  • 정적 라이브러리를 사용하여 컴파일을 하면 링커가 프로그램이 필요로 하는 부분라이브러리에서 찾아 실행파일에 바로 복사합니다.
  • 실행 파일에 다 들어가기 때문에 실행 시 라이브러리가 필요없습니다.

정리

LIB(정적 static) DLL (동적 dynamic)
장점 1. 속도가 빠르다 2. 작성이 간단하다 3. 컴파일시에 해당 정적 라이브러리의 내용이 실행 바이너리 안에 포함되기 때문에 함께 배포하지 않아도 된다 4. 런타임시 외부 참조가 없어 속도가 빠르다 1. 메인 실행 파일의 사이즈가 작아진다 2. dll에 있는 함수들을 다른 곳에서도 호출하여 쓸 수 있으므로 재사용성이 증대된다 3. DLL 업그레이드시 해당 모듈만 교체하고 메인 프로그램은 컴파일하지 않아도 된다
단점 1. 실행 파일의 크기가 커진다 2. 함수의 재사용성이 코드레벨에서만 가능하다 3. 라이브러리가 업데이트 될 경우 다시 빌드하여 컴파일해야 한다 1. 사용이 복잡하다 2. 속도가 lib에 비해 느릴 수 있다 3. 컴파일시에 해당 동적 라이브러리의 내용이 실행 파일안에 포함되지 않기 때문에, 반드시 실행 파일 배포시에는 라이브러리 역시 함께 배포해야 한다.