C++ 프로그래밍

동적 라이브러리(DLL)를 사용할 것인가? 아니면 정적 라이브러리(LIB)를 사용할 것인가?

하늘흐늘 2021. 11. 18. 12:59
반응형

일정 규모 이상의 프로그램을 만들다보면 공통적으로 참조하는 공통 라이브러리를 만들고 여러 프로그램에서 참조하게 하는 경우가 종종 있습니다. 공통 라이브러리는 프로그램에 내용이 포함되는 정적 라이브러리와 DLL, SO등의 별도 확장자로 필요에 따라 로딩되어 참조되는 동적 라이브러리가 있습니다. C++이나 기타 언어의 서적을 보게 되면 실행 파일이 참조하는 라이브러리로 보통은 동적 라이브러리를 많이 추천합니다.

동적 라이브러리의 장점은 아래와 같습니다.
첫째로 여러 프로그램이 참조하더라도 라이브러리 사용 메모리는 하나의 프로그램의 사용에 필요한 만큼만 필요합니다. 덕분에 메모리는 여러개의 프로그램에서 참조하더라도 (사용 프로그램 수 N개 - 1) * 사용 메모리 크기 만큼 절약하게 됩니다.
둘째로 라이브러리가 문제가 생길 때 프로그램의 재컴파일 없이 동적 라이브러리만 재컴파일하여 사용하면 됩니다. 이 장점의 한계는 프로그램에서 참조하는 함수나 클래스의 인터페이스가 변경되면 참조하는 프로그램도 재컴파일되어야 한다는 것입니다.

동적 라이브러리의 단점은 아래와 같습니다.
첫째로 라이브러리 함수나 클래스의 노출을 위하여 별도의 지정자를 설정하여야 합니다.
둘째로 디버깅을 사용 프로그램에서 할 수 없는 관계로 별도의 동적 라이브러리 프로젝트로 해주어야 합니다.
세번째로 실행시 컴파일된 동적라이브러리인 DLL이나 SO 파일을 찾는 문제가 발생합니다. 부가적으로 최신 DLL이나 SO을 찾는 문제가 발생할 수도 있습니다. 또한 별도의 동적라이브러리 배포 문제도 발생합니다.

이와 반대로 정적 라이브러리의 장점 및 단점은 동적 라이브러리의 장점 및 단점의 반대가 됩니다.

프로젝트를 할 때 동적 라이브러리를 많이 만들고 사용하는 것이 사실입니다. 분명히 동적라이브러리는 Win32/64 API, MFC, C/C++ CRT라이브러리 같이 내부 인터페이스가 쉽게 변하지 않고 많은 프로그램에서 참조하는 경우 사용하기에 장점이 선명한 선택입니다. 

그런데 몇 개 프로그램에서 참조하는 않는 라이브러리까지 동적라이브러리로 만드는 것은 생산성 낭비인 듯 보입니다. 그 이유는 아래와 같습니다.
첫째로 동적라이브러리는 인터페이스 노출 관련 별도의 작업을 해주어야 합니다. 또한 단순한 버그 수정이 아니라면 라이브러리 내의 인터페이스가 변경되는 경우가 많아 참조하는 프로그램들도 정적 라이브러리처럼 다시 컴파일해주어야 합니다.
둘째로 디버깅을 별도로 하여야 하는 관계로 디버깅이 복잡해집니다.
셋째로 메모리 크기가 늘어난 현재의 컴퓨터 사양에서 몇 개 프로그램에서 사용하지 않는다면 상대적으로 적은 메모리를 사용하는 동적라이브러리로 메모리 사용 이득이 전체 메모리 크기에서 차지하는 비율은 작을 것입니다.

이에 반하여 정적라이브러리를 사용하는 것은 아래와 같은 장점을 가집니다.
첫째로 디버깅이 쉬워집니다. 실행 파일에서 소스를 가지고 디버깅하면 됩니다. 또한 단일 실행파일이 만들어지므로 서비스 중 크래쉬가 나도 원인 찾기가 쉬워집니다. 
둘째로 프로젝트를 나누는 것 이외에 소스에 별도의 작업을 해줄필요 없이 마치 단일 실행파일의 부분을 만드는 것처럼 작업을 할 수 있습니다. 

마지막으로 이 글을 쓴 결론을 간략히 이야기해 보겠습니다. 동적라이브러리의 이득을 명확히 볼 수 있는 상황이 아니라면 정적라이브러리를 사용하는 것이 개발 생산성을 높이고 디버깅 난이도를 낮출 수 있습니다.


반응형