개발/개발 공통

[라이브러리] 정적(static) vs 공유(shared)

growing-dev 2023. 1. 5. 23:40

정적 라이브러리(Static Library)란?

프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣어서 빌드하는 방식의 라이브러리를 의미한다.

정적 라이브러리를 사용하여 컴파일하면 링커가 프로그램이 필요하는 부분을 라이브러리에서 찾아 실행파일에 복사한다.

실행파일에 다 들어가기 때문에 실행할 때 라이브러리가 필요 없이 다 포함되어 있다.

장점은 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고, 완성된 애플리케이션을 안정적으로 사용할 수 있다는 점이다.

반면에 사용하는 모든 오브젝트 코드를 실행 파일에 포함하기 때문에 메모리에 로드되는 애플리케이션 코드 크기가 커진다는 단점이 있다. 리눅스에서는 확장자 a가 붙는다.

 

공유 라이브러리(Shared Library)란?

어떤 라이브러리가 제공하는 기능을 다른 애플리케이션에서 사용하고 싶을 때 라이브러리 코드를 메모리에 하나만 두고 각 애플리케이션에서 이를 공유하는 방식의 라이브러리를 의미한다.

공유 라이브러리를 사용하여 컴파일을 하면 링커가 실행파일에다가 단지 "실행될 때 우선 이 라이브러리를 로딩시킬 것"이라는 표시를 해 둔다. 그러면 실해라 때 라이브러리에 있는 컴파일된 코드를 가져와 사용한다. 즉 공유 라이브러리는 프로그램 실행 시 라이브러리의 코드와 애플리케이션의 코드가 메모리에 로드되는 시점에 링크된다.

그렇기 때문에 라이브러리를 이용하는 애플리케이션에는 호출할 라이브러리 함수의 정보만 들어 있다.

애플리케이션이 실해 오 디어 메모리에 로드된 시점에서야 그 함수가 메모리의 어디에 있는지 알 수 있고, 그곳으로 포인터가 쓰이면서 함수의 호출을 실현한다. 이렇게 하면 정적 라이브러리를 사용하는 것보다 파일 크기가 작아지고, 커널이 메모리에 한 카피의 공유 메모리를 보유하면서 다중의 프로그램들과 공유하기 때문에 메모리가 적게 차지하고, 사용 후 메모리에서 삭제되기 때문에 메모리 사용에 효율적이다.

리눅스는 기본적으로 공유 라이브러리가 있으면 그것과 링크를 시키고, 그렇지 않으면 정적 라이브러리를 가지고 링크 작업을 한다.

배포할 때 공유 라이브러리를 함께 배포하지 않으면 실행 시 라이브러리를 찾을 수 없다는 에러메시지가 나타난다.

윈도에서는 확장자 dll이 붙고, 리눅스에서는 so가 붙는다.

 

결론

두 가지 방식의 차이점과 각 방식의 장단점을 간단히 알아보았다.

당연한 말이지만 각 프로그램의 방식에 따라서 라이브러리를 빌드하는 방식을 정하면 된다.

서로 별로 연관이 없는 기능을 별도로 관리한다고 하면 정적 라이브러리가 더 맞을 것이고, 여러 애플리케이션에서 해당 라이브러리를 많이 사용하거나 공유하는 개념이라고 하면 공유 라이브러리가 더 맞을 것이다.

개인적으로는 큰 용량을 차지하지 않는다면 가능하면 정적 라이브러리로 사용하는 게 더 안전할 것 같다. 

반응형