본문 바로가기

카테고리 없음

gcc환경에서 윈도우용 Dll만들기

DLL은 Dynamic Linking Library에서 첫글자만을 모아서 만든 단어입니다. '동적 연결 라이브러리'라고 부르는데, 기존의 라이브러리가 코드를 작성 당시에 링크된다면, 이것은 실행될때 그 코드들이 링크되는 방식입니다. Visual C++에서는, 처음 프로젝트를 선택할 때 DLL 작성 프로젝트를 선택할 수 있지만, gcc를 사용하는 환경에서는 그런 도움을 받을 수 없습니다. 아직 Windows 환경에서 gcc를 위한 IDE 환경도 없기 때문입니다. 따라서, 전통적인 방법으로 DLL을 작성해야 합니다. Visual C++의 Wizard의 도움을 받지 못한다고 하더라도, gcc에서 DLL을 작성하는 것은 어려운 일이 아닙니다. 다만, Wizard가 자동으로 행하는 작업을 직접 해주어야 하기 때문에 DLL 작성의 자세한 것까지 프로그래머가 알고 있어야 합니다.

먼저, http://www.mingw.org에서 DLL을 어떻게 작성하는가를 알려주고 있는데, Documentation에서 찾을 수 있습니다. 하지만, 이것은 Windows 환경이 아닌 콘솔 환경에서 작동하는 프로그램의 예를 보여주고 있는 것이어서, Windows 프로그램을 작성하는 것에 도움을 주지 못합니다. Windows에서 사용되는 DLL을 작성하기 위해서는, 다음과 같은 프로그램이 필요합니다. 이 프로그램은 mingw의 bin 디렉토리에 있습니다.
  • dlltool.exe

  • dllwrap.exe
여기에서, dllwrap.exe는, dlltool.exe가 여러번 작업해야 할 것은 한번에 할 수 있도록 도와주는 프로그램인데, 어떤 이유에서인지는 몰라도 제대로 작동시키지 못했습니다. 따라서, 실제로 DLL을 만드는데 쓰이는 것은 dlltool.exe라고 할 수 있습니다. 그리고, DLL을 만드는데 필요한 파일은 다음과 같습니다.
  • def File

  • Library
def 파일은, 어떤 함수가 어느 라이브러리에 들어있는지, 정확한 이름은 무엇인지에 대한 정보를 담고 있는 파일입니다. 이 파일은 dlltool.exe에 의해서 생성되는 파일입니다. DLL이 만들어지는 과정은 다음과 같습니다.

  1. 먼저, DLL을 구성하는 헤더 파일과 소스 파일이 있을때, 이들을 컴파일합니다. 이들을 링크하지 않고, 컴파일만 합니다. 옵션은 -c로서, 그 파일 이름이 create.c라고 한다면 다음과 같습니다.

    gcc -c create.c -o create.o


  2. object 파일이 생성되었으므로, def 파일을 생성합니다.

    dlltool --output-def create.def --kill-at --dllname create.dll create.o


  3. def 파일이 생성되었으면, 라이브러리를 생성합니다. 이것은 DLL이 아니라, DLL을 생성할 때 필요한 코드를 참조할 라이브러리입니다.

    dlltool --output-lib libcreate.a --input-def create.def --kill-at --dllname create.dll create.o


  4. 이제 생성한 파일들을 하나로 묶어서 DLL을 작성하는 일만 남았습니다. 하나로 묶는 작업은 gcc를 사용합니다.

    gcc create.o -o create.dll -mwindows -Wall -L. -lcreate -shared



마지막의 -shared 옵션은, 이 파일은 다른 실행 가능한 파일과 연관되어 있다는 것을 컴파일러에게 알려주는 옵션입니다. 링크와 관련된 옵션입니다. 이 옵션을 포함하지 않는다면, WinMain이 없다는 에러메세지를 받게 될 것입니다. 이제 DLL이 생성되고 이 파일을 필요로 하는 곳에 복사하거나, path로 지정되어 있는 디렉토리에 옮겨두면 Windows는 이 DLL이 필요할 때 사용할 수 있습니다.