[C/C++] 라이브러리

2023. 5. 10. 11:36C&C++

라이브러리:

여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일

 

- 정적 라이브러리(Static Linked Library, SLL): 실행파일 안에 라이브러리를 하나로 묶인다는 특징.

정적 라이브러리 파일(*.lib)을 만들고, 이 파일을 사용하는 측에서 헤더파일과, #pragma comment 혹은 프로젝트 속성 창의 링커-입력-추가종속성에서 라이브러리 경로를 입력하면 된다.

실행 파일을 만들 때 링커가 .lib 파일과 컴파일된 *.obj 파일을 링크하여 실행파일을 만들어낸다.

 

-동적 라이브러리(Dynamic Linked Library, DLL): 실행파일 안에 포함되지 않고, 프로그램 실행 시에 참조된다.

따라서 실행 파일의 크기를 상대적으로 작게 만들고, 물리 메모리에 한번 올라간 DLL은 둘 이상의 프로세스가 각각 자신의 가상 메모리에 매핑해서 공유하는 구조를 지니기 때문에 메모리 사용에 있어 효율적이다.

(다만, 이때 이미 올라간 DLL을 매핑하려는 가상 메모리 공간을 해당 프로세스가 이미 다른 목적으로 사용하고 있을 경우에, 기존 DLL을 공유되지 못하고 새로 생성하게 된다.)

 

라이브러리 측에서는 함수 앞에 __declspec(dllexport),

라이브러리를 사용하는 측의 헤더파일에서는 함수 앞에 __declspec(dllimport) 를 붙여야 한다.

또한 C++ 컴파일러의 네임 맹글링 동작을 막기 위해서 함수 앞에 extern "C" 키워드를 붙여야 한다. 그래야 라이브러리를 사용하는 측의 다양한 환경을 지원할 수 있다. (C로 사용한다거나, C++이지만 다른 컴파일러라서 네임 맹글링 규칙이 다르다거나..)

 

1) 암묵적 연결

정적 라이브러리 프로젝트를 만들고 .cpp 파일을 작성 후 빌드하면, *.lib 파일과 *.dll 파일이 만들어진다. 이 때 만들어지는 *.lib 파일은 정적 라이브러리의 그것과 다르게 DLL이 제공하고자 하는 함수 정보(이름 정보)를 지닌다. (링커가 링크 과정에서 헤더 파일에서 선언한 함수가 정의된 dll 파일을 참조할 수 없기 때문에, 이 lib 파일에서 필요한 정보를 가져가서 링크한다.)

따라서 라이브러리를 사용하는 측에서 이 *.lib 파일을 프로젝트에 넣고 실행 파일을 만들어야 한다. (라이브러리 파일을 명시도 해줘야 한다.) dll 파일은 표준 검색 경로에 있으면 된다.

 

2) 명시적 연결

.lib 파일은 필요가 없고, LoadLibrary / GetProcAddress / FreeLibrary 함수를 통해 사용한다.

프로세스는 내부적으로 DLL의 레퍼런스 카운트(프로세스마다 독립적)를 계산한다.이 레퍼런스 카운트가 0이 될 때 가상 메모리에서 DLL을 해제한다. 

 

명시적 연결 방법은 필요한 시점에만 메모리를 차지하기 때문에 메모리가 절약되고, 프로그램 실행 중에 같은 함수 이름에 대해 DLL 교체가 가능하며, 프로그램 중간에 메모리에 로딩하기 때문에 프로그램 실행까지의 시간을 늘리지 않는다는 장점이 있지만, 

암묵적 연결방법이 코드가 간결하고 사용하기 쉽기 때문에 보통 암묵적 연결방법이 더 선호된다.

'C&C++' 카테고리의 다른 글

[C++] 모던 C++(C++11) 기초  (1) 2023.05.09
[C&C++] const 키워드  (0) 2023.04.25
[C/C++] 소켓 API  (0) 2023.04.06
[C++] 간단한 디자인패턴  (0) 2022.01.07
[C++] 템플릿  (0) 2022.01.07