DLL, LIB: 차이점과 이해
프로그래밍을 할 때, 특히 외부 코드를 통합하거나 대규모 애플리케이션을 작성할 때 DLL(동적 링크 라이브러리)과 LIB(정적 라이브러리) 파일을 자주 접하게 됩니다. 이번 글에서는 DLL과 LIB 파일이 무엇인지, 어떻게 다른지, 그리고 프로젝트에 어떻게 활용할 수 있는지 알아보겠습니다.
DLL과 LIB 파일이란?
먼저, 간단하게 정의를 내리자면:
- DLL: 동적 링크 라이브러리 (Dynamic Link Library)입니다. 프로그램이 실행되는 중에 동적으로 메모리에 로드되어 사용됩니다.
- LIB: 정적 라이브러리 (Static Library)입니다. 프로그램이 컴파일될 때 라이브러리가 포함됩니다.
이 두 파일은 외부 코드를 활용할 수 있게 도와주는 라이브러리의 형태로, 각각 사용 시점과 방식이 다릅니다.
LIB (정적 라이브러리)
정적 라이브러리는 컴파일 단계에서 라이브러리 파일을 프로그램에 포함시키는 방식입니다.
어떻게 작동하나요?
보통 실행 파일을 만들 때, 소스 코드를 컴파일하여 만들어진 obj 파일들을 링커가 모아서 하나의 exe 파일을 생성합니다. 이 과정에서 LIB 파일을 사용하면, 링커가 LIB 파일을 exe 파일에 함께 묶어줍니다. 쉽게 말하면, LIB 파일의 모든 내용이 exe 파일 안에 포함되는 것입니다.
예를 들어, 우리가 자주 사용하는 stdio.h 같은 코드가 모두 exe 파일 안에 포함됩니다. 이 방식은 많은 기능을 포함할 수 있지만, 프로그램 크기가 커질수록 메모리를 많이 차지하게 됩니다.
PCH (Pre-Compiled Header)와의 차이는?
PCH는 컴파일러가 헤더 파일의 내용을 컴파일할 때 사용되지만, LIB는 이미 컴파일된 obj 파일을 연결하는 역할을 합니다. 또, PCH는 사용하는 곳마다 명시해야 하지만, LIB는 그렇지 않아도 됩니다.
LIB 파일을 소스에 적용하기
다른 프로젝트에서 LIB 파일을 사용하려면 두 가지가 필요합니다:
- 링커에게 LIB 파일의 경로를 알려주기
- 해당 라이브러리의 헤더 파일(include) 경로를 설정해주기
DLL (동적 라이브러리)
DLL은 실행 시에 동적으로 로드되는 라이브러리입니다. DLL은 실행 파일이 동작할 때, 링커가 DLL의 위치를 알고 있다면 프로그램이 그 내용을 불러와 사용할 수 있습니다. 즉, 프로그램 자체에는 해당 코드가 포함되지 않지만, 실행 중에 필요한 라이브러리를 메모리에 로드하여 사용합니다.
동적 링킹의 장점
- 실행 파일의 크기를 줄일 수 있습니다.
- 메모리(RAM) 절약이 가능합니다. 여러 파일에서 동일한 DLL 파일을 사용할 경우, RAM에는 DLL이 한 번만 올라가게 됩니다.
- 또한, 업데이트된 DLL 파일만 교체하면 프로그램을 재컴파일하지 않아도 기능을 업데이트할 수 있습니다.
DLL 파일 사용하기
DLL 파일을 사용할 때는 두 가지 방식이 있습니다:
- 암시적 링킹: 실행 파일에 어떤 DLL과 함수를 사용할지 미리 명시하고, 운영체제가 실행 시 해당 DLL을 불러오는 방식입니다.
- 명시적 링킹: 실행 중에 DLL 파일을 불러와서 원하는 함수만 동적으로 사용하는 방식입니다.
대부분의 오픈 소스 라이브러리는 암시적 링킹 방식을 사용합니다.
프로젝트에 DLL/LIB 적용하기
DLL 파일을 적용하려면?
DLL을 사용할 때는 세 가지 파일이 필요합니다:
- LIB 파일: 정적 라이브러리가 아닌, DLL에서 불러올 함수 정보가 포함된 파일입니다.
- 헤더 파일 (include): 함수의 선언부를 포함한 파일입니다.
- DLL 파일: 함수의 실제 구현이 담긴 파일입니다.
컴파일 단계에서:
- 링커에게 LIB 파일의 경로를 알려줍니다.
- 헤더 파일의 경로도 함께 알려줘야 합니다.
이 과정을 거치면 컴파일이 완료됩니다.
실행 단계에서:
실행할 때는 프로그램이 DLL 파일을 찾아야만 실행이 가능합니다. 그렇지 않으면 DLL 파일이 없어 실행 오류가 발생할 수 있습니다.
오픈 소스 라이브러리 적용하기
프로젝트에 오픈 소스를 적용할 때, 크게 두 가지를 고려해야 합니다:
- 컴파일만 할 것인가? 컴파일에 성공하더라도 DLL이 없다면 실행되지 않습니다.
- 실행을 목표로 한다면, DLL 파일만 있으면 됩니다. 이 경우 컴파일 과정에서 LIB 파일과 헤더 파일을 연결할 필요는 없습니다.
Visual Studio에서 파일을 링크하는 예시는 다음과 같습니다.
Visual Studio에서 파일 링크하기 (예: pthread)
- 컴파일하기 위해서는 LIB 파일과 헤더 파일이 필요합니다.
- 링커 > 일반 > 추가 라이브러리 디렉터리: 해당 LIB 파일의 경로를 입력합니다.
- 링커 > 입력 > 추가 종속성: 해당 LIB 파일의 이름을 입력합니다.
- C/C++ > 일반 > 추가 포함 디렉터리: 해당 헤더 파일의 경로를 입력합니다.
- 실행할 때는 해당 DLL 파일의 경로를 설정합니다.
마무리
DLL과 LIB는 외부 코드를 효율적으로 사용하는 중요한 수단입니다. 각각의 장단점을 이해하고, 상황에 맞게 사용하는 것이 성능 최적화의 중요한 부분입니다.
이와 같은 방식으로 DLL과 LIB의 차이점과 사용 방법을 이해하고 적용하면, 프로젝트를 좀 더 유연하고 효율적으로 관리할 수 있을 것입니다.