dll(Dynamic Linking Libray) 은 동적 연결 라이브러리다.
우선 dll에 대해서 간단히 언급하고 dll 만드는 방법을 설명하려 한다.
보통 C++을 막 배우기 시작해서 프로그램을 만들면 exe 파일 하나만 달랑 나온다. 이것은 실행파일이고 이 파일 안에 프로그래머가 정의한 함수를 비롯한 모든 코드가 모두 포함되어 있다.
그런데 프로그래머가 정의한 함수를 실행파일과 분리해서 dll 파일안에 넣어둘 수가 있다. 달리말하면 프로그램이 처음 로딩될 때 메모리에 적재할 코드와 런타임 시에 그때 그때 필요한 코드를 구분해서 메모리를 효율적으로 사용할 수 있다. 또한 동시에 실행되는 여러 프로그램에서 같은 함수를 사용할 경우 각 프로그램에서 동일한 dll을 참조하면 되므로 같은 함수를 여러번 로딩하는 비효율성도 없앨 수 있다.
뭐 단점이라면 런타임시에 필요한 함수를 dll 파일에서 빼와서 메모리에 그때 그때 적재하므로 약간의 실행속도가 저하될 수 있다는 것.
반대로 정적(static) 라이브러리라는 것도 존재한다. 동적라이브러리와 정적라이브러리는 서로 자주 비교되므로 간단히 언급하면..
정적 라이브러리는 쉽게말해 컴파일 타임에 실행파일로 로딩되고 동적 라이브러리는 런타임에 메모리로 로딩된다.
정적 라이브러리는 컴파일 타임에 로딩되므로 실행파일에 모두 포함되어 실행파일이 커지게 된다.
반면에 동적 라이브러리는 런타임에 메모리에 로딩되므로 실행파일의 크기는 줄일 수 있다. 또한 dll 파일 내에 있는 함수에 버그가 있다면 해당 dll 파일만 수정하면 되지만 정적 라이브러리의 경우 정적 라이브러리를 수정한 수 다시 컴파일을 거쳐야 한다.
vs 2015 community c++로 dll 파일 만들기
vs를 실행하여 새프로젝트를 선택하면 다음과 같은 창이 뜬다.
템플릿->c++->win32->Win32 콘솔 응용프로그램을 선택한 후 프로젝트 이름(HelloFunc)과 솔루션 이름(HelloFuncLibrary)를 정한 후 확인을 누른다.
다음 클릭
라디오 버튼 DLL을 선택하고 마침을 누른다.
솔루션 탐색기를 잘 살펴보자. 소스파일 폴더에 프로젝트 이름에 해당하는 HelloFunc.cpp파일이 생성되어 있다. 따라서 헤더 파일에 HelloFunc.h 파일을 추가하는 작업을 해줘야 한다.
헤더파일에서 마우스 오른쪽 클릭-> 추가 -> 새항목 선택
헤더파일을 선택하고 헤더파일 이름을 HelloFunc.h로 한 후 추가를 누름
HelloFunc.h
vs c++에서 dll 프로젝트를 만들면 기본적으로 프로젝트이름_EXPORTS 가 프로젝트 빌드 시에 #define에 의해서 정의된다.
그리고 위 코드처럼 HELLOFUNC_EXPORTS의 정의 유무에 따라서 HELLOFUNC_API의 정의를 해주도록 한다.
정의될 함수 앞에 앞에서 정의한 HELLOFUNC_API를 붙여준다.
HelloFunc.cpp
헤더파일을 포함 시킨 후 앞에서 헤더파일에서 선언한 함수를 정의해준다. 이 부분은 쉽게 이해할 수 있을 것이다.
이제 빌드 -> 솔루션 빌드를 해주면 다음과 같은 파일들이 생성된다.
dll 파일 사용하기
특정 프로젝트에서 앞에서 만든 dll 프로젝트를 사용하여 printHello와 printGoobye 함수를 호출해 보겠다.
우선 새로운 솔루션과 새로운 프로젝트나 먼저 만들어 보겠다. 그런데 보통 진행하는 프로젝트에 포함될 dll 파일은 같은 솔루션 내에서 만들지만 다른 솔루션에서 만든 dll 프로젝트를 가져올 수도 있다. 시나리오는 여러가지가 있을 수 있다.
우선 여기에서는 dll 프로젝트와 진행할 프로젝트가 서로 다른 솔루션이다. 이런 경우 dll 프로젝트의 폴더를 통채로 진행하는 솔루션 폴더로 옮겨 오는 것이 편리하다. 그러나 여기에서는 옮기지 않고 진행해 보겠다.
새로운 솔루션과 빈프로젝트를 만들자.
솔루션에서 마우스 오른쪽 클릭 -> 추가 -> 기존 프로젝트를 선택한 후 앞에서 만든 dll 프로젝트 폴더에 있는 HelloFunc.vcxproj를 선택해 준다.
참조에서 마우스 오른쪽 클릭 -> 참조 추가
프로젝트 -> 솔루션에 보면 우리가 포함시킨 dll 프로젝트(HelloFunc) 가 보인다. 체크해준 후 확인을 눌러주면 된다.
그 다음으로
진행할 프로젝트의 속성에 들어가서
일반 -> 추가 포함 디렉터리에 dll 프로젝트가 있는 폴더의 위치를 넣어준다. 위에서는 절대 경로를 사용했지만 같은 솔루션 폴더로 옮겨왔다면 상대경로 ..\HelloFunc;를 넣어주면 된다.
이제 모든 준비는 완료되었다.
프로젝트 내에서 dll 프로젝트의 헤더파일을 포함시킨 후에 dll 프로젝트에서 만든 함수를 사용해보자.
그리고 어떤 파일들이 생성되었는지 확인해 보자. dll 파일 없이 myProject.exe 따로 옮겨서 실행하면 프로그램은 제대로 실행되지 않는다.