프로그래밍/부록

@DLL 동적 라이브러리 만들기

코딩하는상후니 2023. 1. 30. 18:42

 


 

컴파일, 링킹 과정을 정리하다가 동적 라이브러리를 만들어보는 예제가 있어서 만들어보고 간단히 정리해보고자 글을 쓴다.
 
동적 라이브러리를 만드는 과정은 참고된 링크에 자세히 설명되어있다.
해당 동적 라이브러리 프로젝트 빌드 시, dll 파일이 생성된다.
dll 파일은 '윈도우 운영체제' 에서 동적 라이브러리를 적용하기 위해 만든 파일의 확장자 명이다.
리눅스 환경에서는 .so 라는 확장자 명을 사용한다.
 
 
 

* 동적 라이브러리

 
컴파일 시, 라이브러리가 프로그램 안에 내장되어지는 정적 라이브러리와는 달리,
동적 라이브러리는 프로그램 실행 후 운영체제에 부여받는 가상 메모리 위에 올려진다.
운영체제에 의해서 지정된 페이지로 나뉘어지며 페이지 테이블에 기입된다.
이 때, 이미 해당 라이브러리가 실제 메모리에 올려져 있다면 해당 메모리를 페이지 테이블에 참조시킨다.
다수의 프로그램이 해당 라이브러리를 공유함으로써 메모리가 절약된다.
 
즉,
사용될 라이브러리는 가상 메모리에 올려져있지만 실제 메모리에선 라이브러리 하나를 여럿이 공유하고 있는 형태가 된다.
 
 
 
 

* Visual Studio 동적 라이브러리 설정

 
조금 혼동될 수 있는 경로 설정 방법을 정리해두려고 한다.
 
 
 

1. 메인 프로젝트에 라이브러리 경로 포함시키기

 
속성 -> C++ -> 일반 -> 추가 포함 디렉터리

 

 

해당 경로는 상대 경로로 설정 가능하다. 솔루션이 존재하는 폴더와는 다른 폴더이다. 프로젝트 폴더가 더 하위 폴더이다.
때문에 ../ 키워드를 이용해 우리가 만든 MathLibrary 경로를 넣는다.
 
혹은 절대 경로를 이용하는 방법도 있다.
추가 포함 디렉터리 창에서 입력줄 오른쪽 끝을 누르면 폴더를 선택 가능하다.
 
 
 
 

2. 라이브러리 경로 링커에게 알려주기

 
속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리

 

 

 

lib 파일이 위치한 경로를 알려주면 된다.
참고된 예제의 동적 라이브러리로 생성된 프로젝트는 빌드 시 라이브러리가 생성된다. 해당 라이브러리 경로를 넣으면 된다.
편한 빌드 과정을 위해 따로 폴더를 만들고 프로젝트 빌드 시
해당 폴더에 라이브러리를 생성되도록 동적 라이브러리 프로젝트에서 설정한 후 따로 만든 폴더 경로를 넣어도 된다.
이 폴더에 모든 라이브러리를 관리할 수 있겠다.
 
 
 
 
 

3. 라이브러리 파일 이름 링커에게 알려주기

 
속성 -> 링커 -> 입력 -> 추가 종속성

 

 

 

2번 항목에 추가한 경로에 있는 라이브러리 중 사용될 라이브러리 파일 이름을 기입한다.
 
 
 
 
 

* __declspec( dllexport ) , __declspec( dllimport )

 

 

#ifdef MATHLIBRARY_EXPORTS 
#define MATHLIBRARY_API __declspec(dllexport) 
#else 
#define MATHLIBRARY_API __declspec(dllimport) 
#endif

 

1) __declspec ( dllexport )
=> 이 키워드는 보통 dll 라이브러리 안에서 해당 함수를 내보낸다 ( export )  는 의미로 보통 Dll 라이브러리 안에서 사용됨.
 
2) __declspec ( dllimport )
=> 반대로 import 는 해당 라이브러리를 사용할 프로그램에서 dll 헤더를 추가했을 때 쓰여지는 키워드로 해당 함수를 import 하겠다는 의미.
 
 
 
 

* extern 키워드

 

extern "C"
 
이 키워드는 C 및 C++ 에서 사용할 수 있는 함수를 의미한다.

 

 

extern "C++"

 

물론 위처럼, C++ 에서만 사용할 수 있는 함수라고 표시할 수 있다.
다만, C++ 컴파일러 위에선 디폴트 ( default ) 이다. ( 선언되는 모든 함수에 해당 키워드가 숨어있다. )

 

 

 


 

참고 자료

 

 

 
 
 

 

 

 

 

 

'프로그래밍 > 부록' 카테고리의 다른 글

@C++ 링킹에 대한 이해  (0) 2022.07.27
@C++ 컴파일 에 대한 이해  (0) 2022.07.26